.netのSystem.IO.Compression.GZipStreamを使用して、ディレクトリを圧縮および解凍したかったのです。しかし、私はそれが単一のファイルを圧縮できることがわかります、どのように私はzipファイルに特定のディレクトリを圧縮することができますzipクラスを書くことができますか?.netで独自のzipクラスを書き込む方法
PS:私たちは、あなたが最初にファイルをTARする必要があり、第三者のzipライブラリを使用する
.netのSystem.IO.Compression.GZipStreamを使用して、ディレクトリを圧縮および解凍したかったのです。しかし、私はそれが単一のファイルを圧縮できることがわかります、どのように私はzipファイルに特定のディレクトリを圧縮することができますzipクラスを書くことができますか?.netで独自のzipクラスを書き込む方法
PS:私たちは、あなたが最初にファイルをTARする必要があり、第三者のzipライブラリを使用する
.zipファイル形式には多くの文書があります。ウィキペディアは始めるのに適しています: http://en.wikipedia.org/wiki/ZIP_file_format。
あなたは、実際の圧縮にSystem.IO.Compression.DeflateStream
を使用することができますが、CRC32の実装が必要になりますし、あなたが正しいヘッダを持つファイルをレイアウトする必要があるでしょう、など
それは非自明である仕事量。
オープンソースライブラリを使用できない場合は、商用の.zipライブラリを購入することをお勧めします。商用ライブラリ**の使用に関して法的な問題はないはずです。ライセンスを購入するための費用は、ライブラリを自分で開発してテストするコストよりも確かに安いです。また、周りを確認してください。あなたの会社はすでに商用ライブラリのライセンスを持っているかもしれません。
**私は弁護士ではありませんので、法務担当者にご確認ください。
を許可されていません。
EDIT
独自のヘッダを設計し、各ZIPファイルを順番に書いていない、なぜあなたは冒険を感じている場合。ヘッダー内のすべてのファイル名と開始位置のインデックスを格納します。
実際に私たちのチームはSharpZipLibを使用していますが、私たちのチームリーダーは潜在的なLCA問題について心配していましたので、私たちは自分で簡単なクラスを書くつもりです。また、私たちの圧縮ファイルは標準と互換性があるはずです。 – CMinus
私はGoogleを試しましたが、LCAの定義が矛盾しています。また、私たちのチームはSharpZipLibを素晴らしい結果で使用しています。 – ChaosPandion
System.IO.DirectoryおよびSystem.IO.Fileクラスを使用してすべてのファイルとフォルダを列挙し、再帰的にサブフォルダにファイルを格納するようにします。すべてのファイルを一度に1つずつ圧縮する(またはスレッドプールを使用する)と、必要なものを用意する必要があります。
3.0以上の場合は、System.IO.Packagingを使用してzipファイルを作成できます。
あなたはいくつかのオプション
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は、マイクロソフトのパブリックライセンスの下で、非常に容認され、ウイルス性の言葉ではなくリリースされています。
宿題のように聞こえます –
これは宿題ではないため、潜在的なLCAの問題のために第三者図書館を使用することはできません。 – CMinus