private/functions.ps1
using namespace System.IO using namespace System.IO.Compression using namespace System.Text function GzipFrameworkReader { [CmdletBinding()] param( [Parameter(Mandatory, ValueFromPipeline)] [FileInfo] $File, [Parameter()] [FileStream] $OutStream, [Parameter()] [switch] $Raw, [Parameter(Mandatory)] [Encoding] $Encoding ) process { try { # Credits to jborean - https://github.com/jborean93 for this craziness $sb = [StringBuilder]::new() $stream = $File.OpenRead() $marker = 0 while (($b = $stream.ReadByte()) -ne -1) { if ($marker -eq 0 -and $b -eq 0x1F) { $marker += 1 } elseif ($marker -eq 1) { if ($b -eq 0x8B) { $marker += 1 } else { $marker = 0 } } elseif ($marker -eq 2) { $marker = 0 if ($b -eq 0x08) { try { $subStream = $File.OpenRead() $null = $subStream.Seek($stream.Position - 3, [SeekOrigin]::Begin) $gzip = [GZipStream]::new($subStream, [CompressionMode]::Decompress) $reader = [StreamReader]::new($gzip) if($PSBoundParameters.ContainsKey('OutStream')) { $gzip.CopyTo($OutStream) continue } if($Raw.IsPresent) { while(-not $reader.EndOfStream) { $sb = $sb.AppendLine($reader.ReadLine()) continue } } while(-not $reader.EndOfStream) { $reader.ReadLine() } } finally { $reader, $gzip, $subStream | ForEach-Object Dispose } } } } if($Raw.IsPresent) { $sb.ToString() } } finally { if($stream -is [IDisposable]) { $stream.Dispose() } } } } function GzipCoreReader { [CmdletBinding()] param( [Parameter(Mandatory, ValueFromPipeline)] [FileInfo] $File, [Parameter()] [FileStream] $OutStream, [Parameter()] [switch] $Raw, [Parameter(Mandatory)] [Encoding] $Encoding ) process { try { $inStream = $File.OpenRead() $gzip = [GZipStream]::new($inStream, [CompressionMode]::Decompress) if($PSBoundParameters.ContainsKey('OutStream')) { return $gzip.CopyTo($OutStream) } $reader = [StreamReader]::new($gzip, $Encoding, $true) if($Raw.IsPresent) { return $reader.ReadToEnd() } while(-not $reader.EndOfStream) { $reader.ReadLine() } } catch { $PSCmdlet.WriteError($_) } finally { $gzip, $reader, $inStream | ForEach-Object Dispose } } } |