C#を使用してzipアーカイブを操作する必要が何度もありましたが、私の場合はデータベースを使用してアーカイブをダウンロードしていたので、テキストファイルでない場合はデータベースをディスクに抽出し、データベースを動的に接続しました。そうでなければ必要なデータを読み取りました これらの目的のために、私はZipStorerを使用しました。ZipStorerは、割り当てられた作業を行うだけで、重量が少なく、最小限のジェスチャで実行可能ファイルに含まれるクラスです。 今日、私は別の何かを試すことにしました。そのために2つのSharpZipLibとDotNetZipライブラリを選択し、その後、どちらが将来役に立つかを理解するために少しテストを行いました。
すでにZipStorerに言及しているので、ZipStorer.csクラスを追加してそのようなメソッドを記述するだけで、すべての機能が動作するようになります。
private void Unzip( string fileInput, string saveFile)
{
// Open an existing zip file for reading
using (ZipStorer zip = ZipStorer.Open(fileInput, FileAccess.Read))
{
// Read the central directory collection
List <ZipStorer.ZipFileEntry> dir = zip.ReadCentralDir();
// Look for the desired file
string DBfile = string .Empty;
foreach (ZipStorer.ZipFileEntry entry in dir)
{
if (Path.GetFileName(entry.FilenameInZip).ToLower().IndexOf( ".txt" ) != -1)
{
DBfile = Path.GetFileName(entry.FilenameInZip);
zip.ExtractFile(entry, saveFile + DBfile);
//Now we can connect to database or read file
}
}
}
}
* This source code was highlighted with Source Code Highlighter .
次に、SharpZipLibとDotNetZipでこのようなことを行うのがどれほど簡単かを調べます。 SharpZipLibの使用例は、このリンクまたは公式ソースで見つけることができます。DotNetZipの作業例は、 ライブラリのアーカイブにすぐに含まれます 。
ライセンス:
SharpZipLib-GPL
DotNetZip-Ms-PL
今回は、開発者のサイトからの情報を翻訳しないことにしましたが、どちらのライブラリもCompact Frameworkをサポートしており、Webアプリケーションで使用できるとしか言えません。 両方のライブラリのサイズは約200キロバイトですが、DotNetZipでは「縮小」バージョンを使用しますが、フルバージョンでは約400キロバイトを使用します。これは2倍です。 ここで、ZipStorerとは異なり、テストに直接渡して、データをアーカイブし、圧縮率と速度を比較します。 デフォルトレベルでアーカイブします。DotNetZipの場合、CompressionLevelプロパティは「Default」または「Level6」に設定され、SharpZipLibのGetLevel()メソッドは「6」を返します。
ライブラリには同じ名前のクラスがあるため、次のようにスペースを接続しました。
using test1 = Ionic.Zip;
using test2 = ICSharpCode.SharpZipLib.Zip;
DotNetZipを使用してアーカイブするには、次のコードで十分です。
string ZipFileToCreate = Application.StartupPath + @"\test1.zip" ;
string FileToZip = textBoxFile.Text;
using (test1.ZipFile zip = new test1.ZipFile())
{
test1.ZipEntry ze = zip.AddFile(FileToZip);
zip.Save(ZipFileToCreate);
}
* This source code was highlighted with Source Code Highlighter .
SharpZipLibについては、もう少し書く必要があります。
string file = textBoxFile.Text;
using (test2.ZipOutputStream s = new test2.ZipOutputStream( File .Create(Application.StartupPath + @"\test2.zip" )))
{
byte [] buffer = new byte [4096];
test2.ZipEntry entry = new test2.ZipEntry(Path.GetFileName(file));
s.PutNextEntry(entry);
using ( FileStream fs = File .OpenRead(file))
{
int sourceBytes;
do
{
sourceBytes = fs.Read(buffer, 0, buffer.Length);
s.Write(buffer, 0, sourceBytes);
} while (sourceBytes > 0);
}
s.Finish();
s.Close();
}
* This source code was highlighted with Source Code Highlighter .
公式の例から両方のコードを取り出し、スペースを節約するためにコメントを削除しました。 結果はこの表で見つけることができます:
テスト用のファイルは人工的に生成されたので、実際のデータで状況がどのように変化するかを確認するためにレジストラのサイトからドメインのリストをダウンロードします。ダウンロードしたアーカイブは標準で、サイズは28,043,005バイトで、データを抽出しますアーカイブから2つのライブラリを再度チェックします。
おわりに
結果に基づいて、速度特性はDotNetZipの方が優れていますが、同時にこのライブラリのデータ圧縮は悪くなります。圧縮率を変更せず、両方のライブラリで6に等しいことを思い出してください。 、ダウンロードされたこのライブラリの数が10万を超えることは、私の選択が単独ではないことを示唆しています。