[Tips]DotNetZipライブラリを使用して、Zipファイルを解凍する

これまでに下記の記事でZipファイルを作成する方法を紹介しました。

今回は、Zipファイルを解凍する関数を作ってみたので紹介します。

[void][System.Reflection.Assembly]::LoadFrom("c:\work\Ionic.Zip.dll")

function Unpack-Zip([string]$TargetFile, [string]$TargetDir)
{
    $zipfile =  new-object Ionic.Zip.ZipFile
    #解凍するファイルの読み込み
    $zip = [Ionic.Zip.ZipFile]::Read($TargetFile)
    if ($TargetDir.Length -eq 0)
    {
        $TargetDir = Split-Path $TargetFile -Parent
    }
    $zip | %{$_.Extract($TargetDir, [Ionic.Zip.ExtractExistingFileAction]::OverWriteSilently)}
    Write-Host "解凍が完了しました!!"
}

Ionic.Zip.dllの使用方法については、過去記事を参照ください。

ZipファイルはExtractメソッドで行っています。

Extractメソッドの引数にOverWriteSilentlyを渡しているので、ファイルが既存する場合には上書きされます。

この関数の書式は

Unpack-Zip 解凍するファイルのパス [解凍先ディレクトリ]

です。

解凍先ディレクトリは省略することができ、省略した場合はZipファイルがあるディレクトリに解凍されます。

PowerShell で DotNetZip を使用する ~自己解凍形式ファイルの作成~

引き続きPowerShellでDotNetZipを使用する例について取り上げます。

今回は、自己解凍形式のファイルを作成する方法です。

DotNetZipをPowerShellで使用する方法については、過去記事を参照ください。

早速ですが、自己解凍形式のファイルを作成するには SaveSelfExtractor というメソッドを使用します。

このメソッドの構文は

SaveSelfExtractor(“作成する自己解凍形式ファイルのパス”, 解凍オプション)

です。

解凍オプションはSelfExtractorFlavorという列挙体で下記に示すものがあります。

ConsoleApplication 解凍時にコンソールを表示
WinFormsApplication 解凍前に、ダイアログを表示する。このダイアログでは、自己解凍形式ファイルに含まれているファイルの確認を行うことができる。また[Extract]ボタンをクリックすることで解凍される。図1

図1 列挙体WinFormApplicationを指定した場合

たとえば C:\Work2\test.exe という自己解凍形式ファイルを作成する場合は

$zipfile.SaveSelfExtractor("C:\Work2\test.exe",[Ionic.Zip.SelfExtractorFlavor]::WinFormsApplication)

のように記述します。

参考までに、リストを掲載しておきます。

#自己解凍形式の圧縮ファイルを作成する[System.Reflection.Assembly]::LoadFrom("c:\work\Ionic.Zip.dll");$zipfile =  new-object Ionic.Zip.ZipFile$zipfile.AddFile("C:\Work\MyLib.dll")$zipfile.SaveSelfExtractor("C:\Work2\test.exe",[Ionic.Zip.SelfExtractorFlavor]::WinFormsApplication)$zipfile.Dispose()

PowerShell で DotNetZip を使用する ~ファイル名に日本語が含まれる場合の対応~

前回の記事(PowerShell で DotNetZip を使用する)で、PowerShelでZIPファイルを作成する方法について説明しました。

しかし、前回紹介した方法では、ファイル名に日本語が含まれている場合は文字化けを起こし、正常に解凍することができないファイルが作成されてしまします。

この問題を回避するには、New-Objectコマンドレットでオブジェクトを作成するときにエンコーディング(Shift_Jis)を指定します。

$Encoding = [System.Text.Encoding]::GetEncoding("shift_jis")
$zipfile = new-object Ionic.Zip.ZipFile($Encoding)

エンコーディングにShift_Jisを指定してファイルを圧縮する例は下記の通りです。

[System.Reflection.Assembly]::LoadFrom("c:\work\Ionic.Zip.dll")
$Encoding = [System.Text.Encoding]::GetEncoding("shift_jis")
$zipfile = new-object Ionic.Zip.ZipFile($Encoding)
#↓エンコーディングを指定すれば、日本語を含むファイル名であってもOK
$zipfile.AddFile("C:\Work\日本語を含むファイル名.xls","")
$zipfile.Save("C:\Work2\test.zip")$zipfile.Dispose()

PowerShell で DotNetZip を使用する

DotNetZipは、.NET Frameworkで簡単にZipファイルを操作するためのライブラリです。

PowerShellでも使用可能だということをnoraさんのブログ記事「.NETでZIPを操作するライブラリ・DotNetZip Library」にて教えていただきましたので、やってみました。

DotNetZipライブラリの入手についてはnoraさんのブログを参照ください。

 

DotNetZipライブラリを入手後、解凍してできた Ionic.Zip.dll が C:\Work に配置されている前提で話を進めます。適宜読み替えてください。

まずは、Ionic.Zip.dll を読み込みます。

[System.Reflection.Assembly]::LoadFrom("c:\work\Ionic.Zip.dll");

 

次に、New-Objectコマンドレットで ZipFileのインスタンスを作成します。

$zipfile =  new-object Ionic.Zip.ZipFile

 

あとは圧縮したいファイルやフォルダを追加します。

ファイルを追加する場合は AddFileメソッドを使用します。

AddFileめっそっどの第1引数は、作成するZipに含めるファイルを指定します。

第2引数は、Zip内に作成するフォルダ名を指定します。

この引数を指定すると、第1引数に指定したファイルが第2引数で指定したフォルダの中に作成されます。

たとえば、次のコードはMyLib.dll というファイルを、Zipファイル内にLIB1というフォルダを作成して配置します。

このようにしておくと、解凍されたときにLIB1というフォルダが作成され、その中にMyLib.dllが解凍されます。

$zipfile.AddFile("C:\Work\MyLib.dll","LIB1")

フォルダを追加する場合は、AddDirectoryメソッドを使用します。第1引数に圧縮したいフォルダを指定します。

次のコードはC:\Work2というフォルダを追加します。

$zipfile.AddDirectory("C:\Work")

圧縮するファイルやフォルダの追加が終わったら、Saveメソッドを使用して実際に圧縮ファイルを作成します。Saveメソッドの第1引数に保存ファイルパスを指定します。

次のコードはC:\Work2 の下に Test.zip という名前でZipファイルを作成します。

$zipfile.Save("C:\Work2\test.zip")

最後に、オブジェクトを破棄します。

$zipfile.Dispose()

上記をまとめたコードは下記の通りです。

[System.Reflection.Assembly]::LoadFrom("c:\work\Ionic.Zip.dll")
$zipfile =  new-object Ionic.Zip.ZipFile
$zipfile.AddFile("C:\Work\MyLib.dll","LIB1")
$zipfile.AddDirectory("C:\Work")
$zipfile.Save("C:\Work2\test.zip")
$zipfile.Dispose()