Gzip creation in PowerShell – Gzip-FileSimple.ps1

I have a need to compress some of the data I am exporting using PowerShell so I figured why not use PowerShell to do it?  I did not want to have a dependency on the Community Extensions even though they have solved this problem already.  Luckily in newer versions of .Net there is the System.IO.Compression class.

Here is my code which is based off of the Microsoft example for the class.  It should work for simple cases or perhaps serve as a starting point for your enhancements.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# TODO: Use buffering to see if performance can be improved.
function Gzip-FileSimple
{
    param
    (
        [String]$inFile = $(throw "Gzip-File: No filename specified"),
        [String]$outFile = $($inFile + ".gz"),
        [switch]$delete # Delete the original file
    )
 
    trap
    {
        Write-Host "Received an exception: $_.  Exiting."
        break
    }
 
    if (! (Test-Path $inFile))
    {
        "Input file $inFile does not exist."
        exit 1
    }
 
    Write-Host "Compressing $inFile to $outFile."
 
    $input = New-Object System.IO.FileStream $inFile, ([IO.FileMode]::Open), ([IO.FileAccess]::Read), ([IO.FileShare]::Read)
 
    $buffer = New-Object byte[]($input.Length)
    $byteCount = $input.Read($buffer, 0, $input.Length)
 
    if ($byteCount -ne $input.Length)
    {
        $input.Close()
        Write-Host "Failure reading $inFile."
        exit 2
    }
    $input.Close()
 
    $output = New-Object System.IO.FileStream $outFile, ([IO.FileMode]::Create), ([IO.FileAccess]::Write), ([IO.FileShare]::None)
    $gzipStream = New-Object System.IO.Compression.GzipStream $output, ([IO.Compression.CompressionMode]::Compress)
 
    $gzipStream.Write($buffer, 0, $buffer.Length)
    $gzipStream.Close()
 
    $output.Close()
 
    if ($delete)
    {
        Remove-Item $inFile
    }
}

Comment (1)

  1. Don

    Here is a buffered version…

    function Gzip-File
    {
    param
    (
    [String]$inFile = $(throw “Gzip-File: No filename specified”),
    [String]$outFile = $($inFile + “.gz”)
    );

    trap
    {
    Write-Host “Received an exception: $_. Exiting.”;
    break;
    }

    if (!(Test-Path $inFile))
    {
    “Input file $inFile does not exist.”;
    exit 1;
    }

    Write-Host “Compressing $inFile to $outFile.”;

    $input = New-Object System.IO.FileStream $inFile, ([IO.FileMode]::Open), ([IO.FileAccess]::Read), ([IO.FileShare]::Read);
    $output = New-Object System.IO.FileStream $outFile, ([IO.FileMode]::Create), ([IO.FileAccess]::Write), ([IO.FileShare]::None)
    $gzipStream = New-Object System.IO.Compression.GzipStream $output, ([IO.Compression.CompressionMode]::Compress)

    try
    {
    $buffer = New-Object byte[](1024);

    while($true)
    {
    $read = $input.Read($buffer, 0, 1024)

    if ($read -le 0)
    {
    break;
    }

    $gzipStream.Write($buffer, 0, $read)
    }
    }
    finally
    {
    $gzipStream.Close();
    $output.Close();
    $input.Close();
    }
    }

Leave a Comment

Your email address will not be published.