2009-05-22 15 views
2

System.IO.Compression名前空間クラスGZIPStreamおよびDeflateStreamを使用すると、個々のファイルを正常に圧縮および解凍できます。しかし、圧縮の対象としてディレクトリ名を渡すと、セキュリティ例外が発生します。ディレクトリを圧縮できるようにすべてのファイルとサブディレクトリを(再帰的に)列挙する必要がありますか?組み込みの.net圧縮クラスでディレクトリを圧縮するには?

(おそらく、codeplexのdotnetzipがこれをよりうまく処理しますが、これは私が今行っていることではありません)。

答えて

4

GZipStreamなどを使用する場合、ストリームを圧縮しています。ファイルではありません。 GZipにはファイルヘッダー情報がないため、複数のファイルを詰め込む賢明な方法はありません。そのためには、.zipのようなものが必要です。 #ziplibはジョブを実行しますが、まだ(IIRC)は手動で各ファイルをフィードする必要があります。

3

System.IO.Compressionのクラスはストリームのみを処理します。自分でファイル処理をする必要があります。あなたは、おそらく、SharpZipLibまたは類似のファイルをtarに使用して、結果のtarファイルを圧縮することができます。 (未テスト)のようにシンプル:

using (Stream out = new FileStream("out.tar", FileMode.CreateNew)) 
{ 
    TarArchive archive = TarArchive.CreateOutputTarArchive(outStream 
            , TarBuffer.DefaultBlockFactor); 
    foreach (string name in fileNames) 
    { 
     TarEntry entry = TarEntry.CreateEntryFromFile(name); 
     archive.WriteEntry(entry, true); 
    } 
} 
4

System.IO.Compressionクラスは、マルチファイルのアーカイブを管理する方法を提供しません。アーカイブに含まれているものを追跡するファイル形式を作成するには、あなた自身でいくつかの作業を行う必要があります。

How to compress folders and multiple files with GZipStream and C# (System.IO.Compression.GZipStream)

しかし、あなたは唯一のWinZipやWinRARのは、あなたがSharpZipLibのようなものに探し方がいいでしょうしているユーザーとファイルを交換することができますフォーマット後にしている場合:この記事では、あなたが始めるのに役立つかもしれません。

1

人々はこれまでに言及しています。組み込みの.Netクラスは、ディレクトリ構造ではなくストリームを圧縮するのに適しています。

彼らはまたsharpziplibなどが使用する良いライブラリであることを言いました、私は同意します。彼らは便利なZipとTarの実装を提供しています。

しかし、あなたの手が縛られていて、これらのライブラリを使用できない場合、tar formatは本当にシンプルです。実装: Stream ToTar(string pathこと)。これは、圧縮した圧縮アルゴリズムの実装とは異なり、かなりシンプルでまっすぐ進むタスク()

1

です\内容の例here

次PowerShellとSystem.IO.Packaging.ZipPackageでout.zip \に。
$zipArchive = $pwd.path + "\out.zip" 
[System.Reflection.Assembly]::Load("WindowsBase,Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35") 
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open($zipArchive, [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite") 
$in = gci .\in | select -expand fullName 
[array]$files = $in -replace "C:","" -replace "\\","/" 
ForEach ($file In $files) { 
    $partName=New-Object System.Uri($file, [System.UriKind]"Relative") 
    $part=$ZipPackage.CreatePart($partName, "application/zip", [System.IO.Packaging.CompressionOption]"Maximum") 
    $bytes=[System.IO.File]::ReadAllBytes($file) 
    $stream=$part.GetStream() 
    $stream.Write($bytes, 0, $bytes.Length) 
    $stream.Close() 
                } 
$ZipPackage.Close()