2011年11月11日金曜日

◆SharpZipLibを使ってZip圧縮

以前作ったサンプルは非同期に対応できず今ひとつだった。
(それでも今毎日動かしてはいるが)

ケースによってはもう少しまっとうに動く奴が欲しかったりするので、またちょっと調べてみたところ、SharpZipLibを使ったパターンが結構目に付く。

そこで、このdllを使ったスクリプトを試して見た。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022

#ex. dir *.txt | New-ZipFile.ps1 c:\temp\temp.zip
param
(
 
$zipPath = "D:\Desktop\temp.zip"
)
$libName = "ICSharpCode.SharpZipLib"
$namespace = "$libName.Zip.{0}"
$dllPath =
 
 
Join-Path (Split-Path $myInvocation.MyCommand.path) "$libName.dll"
[Void][Reflection.Assembly]::LoadFile($dllPath)
$zipFile =
 
 
New-Object ($namespace -f "ZipOutputStream") ([IO.File]::Create($zipPath))
[byte[]] $buffer = New-Object byte[] 4096
$input | ?{$_ -is [IO.FileInfo]} | %
{
 
$zipEntry = New-Object ($namespace -f "ZipEntry") $_.
name
 
$zipFile.PutNextEntry($zipEntry
)
 
$_.
fullname
 
$fileStream = [IO.File]::OpenRead($_.
FullName)
 
[ICSharpCode.SharpZipLib.Core.StreamUtils]::
Copy(
                                              
$fileStream,$zipFile,$buffer
)
 
$fileStream.
Close()
}

$zipFile.close()

dllはスクリプトと同じ場所にある前提。
とりあえずはファイルだけを対象にしている。

ちょっと試した感じでは良さそうだが、前回のこともあるので色々テストする必要はありそうだ。

--追記

SharpZipLibにはFastZipという簡易的なクラスも用意されているようなので、そのサンプルも載せておく。

001
002
003
004
005
006
007
008
009

#◆圧縮
$targetPath = "F:\Desktop\comp"
$outZipFile = "F:\Desktop\comp.zip"
$dllPath = "F:\Desktop\ICSharpCode.SharpZipLib.dll"
[Void][Reflection.Assembly]::LoadFile($dllPath)
$zipFile =
 
 
New-Object ICSharpCode.SharpZipLib.Zip.FastZip
$zipFile.CreateEmptyDirectories = 
$true
$zipFile
.CreateZip($outZipFile,$targetPath,$true,$null,$null)

0 件のコメント:

コメントを投稿