2009-08-27 11 views
1

.netのSystem.IO.Compression.GZipStreamを使用して、ディレクトリを圧縮および解凍したかったのです。しかし、私はそれが単一のファイルを圧縮できることがわかります、どのように私はzipファイルに特定のディレクトリを圧縮することができますzipクラスを書くことができますか?.netで独自のzipクラスを書き込む方法

PS:私たちは、あなたが最初にファイルをTARする必要があり、第三者のzipライブラリを使用する

+0

宿題のように聞こえます –

+0

これは宿題ではないため、潜在的なLCAの問題のために第三者図書館を使用することはできません。 – CMinus

答えて

3

.zipファイル形式には多くの文書があります。ウィキペディアは始めるのに適しています: http://en.wikipedia.org/wiki/ZIP_file_format

あなたは、実際の圧縮にSystem.IO.Compression.DeflateStreamを使用することができますが、CRC32の実装が必要になりますし、あなたが正しいヘッダを持つファイルをレイアウトする必要があるでしょう、など

それは非自明である仕事量。

オープンソースライブラリを使用できない場合は、商用の.zipライブラリを購入することをお勧めします。商用ライブラリ**の使用に関して法的な問題はないはずです。ライセンスを購入するための費用は、ライブラリを自分で開発してテストするコストよりも確かに安いです。また、周りを確認してください。あなたの会社はすでに商用ライブラリのライセンスを持っているかもしれません。

**私は弁護士ではありませんので、法務担当者にご確認ください。

4

を許可されていません。

EDIT

独自のヘッダを設計し、各ZIPファイルを順番に書いていない、なぜあなたは冒険を感じている場合。ヘッダー内のすべてのファイル名と開始位置のインデックスを格納します。

+0

実際に私たちのチームはSharpZipLibを使用していますが、私たちのチームリーダーは潜在的なLCA問題について心配していましたので、私たちは自分で簡単なクラスを書くつもりです。また、私たちの圧縮ファイルは標準と互換性があるはずです。 – CMinus

+0

私はGoogleを試しましたが、LCAの定義が矛盾しています。また、私たちのチームはSharpZipLibを素晴らしい結果で使用しています。 – ChaosPandion

1

System.IO.DirectoryおよびSystem.IO.Fileクラスを使用してすべてのファイルとフォルダを列挙し、再帰的にサブフォルダにファイルを格納するようにします。すべてのファイルを一度に1つずつ圧縮する(またはスレッドプールを使用する)と、必要なものを用意する必要があります。

2

3.0以上の場合は、System.IO.Packagingを使用してzipファイルを作成できます。

+3

実際、System.IO.Packagingはかなり無駄です。 XPSスタイルのドキュメントで使用するように設計されています。 .zipファイルを作成すると、[Content_Types] .xmlという名前のファイルがルートに追加されます。また、ルートに.xmlファイルが含まれていない.zipファイルを処理することもできません。 – Brannon

+0

そして、zipファイル用のAPIは恐ろしいものです。 – Cheeso

+0

"Content_Types.xml"ファイルを無視できれば、これは完璧です。これは私が自分のプロジェクトに使うものです。 – David

1

あなたはいくつかのオプション

1. Shell.Application
あなたがシェルを呼び出すことができますがあります。 VBScriptでは、次のようになります。

dim sa 
set sa = CreateObject("Shell.Application") 

Dim zip 
Set zip = sa.NameSpace(pathToZipFile) 

Dim d 
Set d = sa.NameSpace(dirToZip) 


For Each s In d.items 
    WScript.Echo s 
Next 


' http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx 
' =============================================================== 
' 2nd arg is a bit field: 
' 4 = do not display a progress box 
' 16 = Respond with "Yes to All" for any dialog box that is displayed. 
' 128 = Perform the operation on files only if a wildcard file name (*.*) is specified. 
' 256 = Display a progress dialog box but do not show the file names. 
' 2048 = Version 4.71. Do not copy the security attributes of the file. 
' 4096 = Only operate in the local directory. Don't operate recursively into subdirectories. 

WScript.Echo "copying files..." 

zip.CopyHere d.items, 4 

' CopyHere is asynchronous. Gotta wait til it's done. 
sLoop = 0 
Do Until d.Items.Count <= zip.Items.Count 
    Wscript.Sleep(1000) 
Loop 

これは管理コードからアクセスできるかどうかはわかりませんが、私は推測しています。それは私にハックの一種を感じる。

また、あなたはそれに物事を追加する前にzipファイルを事前に初期化する必要があります。

Dim fso 
Set fso = CreateObject("Scripting.FileSystemObject") 
Dim file 
Set file = fso.CreateTextFile(pathToZipFile) 

file.Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, 0) 

file.Close 
Set fso = Nothing 
Set file = Nothing 

2.それを自分で実装する
あなたは理論的には、Shell.Applicationを使用しない場合特別な制限がある場合は、あまり問題なく、独自のzipクラス実装を作成することができます。暗号化、zip64、Unicode、高解像度のタイムスタンプ、ストリーミングなどを実装していないと、zip形式は複雑ではありません...

3.法的な見直しを行い、かつ再利用
よりもむしろ新しい実装を開発、エンジニアリング時間を費やすし、今そこにあるの実装を検討します。 SharpZipLibを使ってGPLを心配する人もいます。 DotNetZipは、マイクロソフトのパブリックライセンスの下で、非常に容認され、ウイルス性の言葉ではなくリリースされています。

関連する問題