System.IO.Compressionを使用してZIPファイルを読み書きする方法は?
-
06-07-2019 - |
質問
ZIPファイルを操作するためのライブラリがある。また、 Windowsに組み込まれている機能を使用してZIPファイルを処理する。
しかし、.NET内のSystem.IO.Compression名前空間に組み込まれたツールを使用してZIPファイルを読み書きする方法を誰かが考え出したのだろうか?または、この名前空間のみを使用することはできませんか?
更新:System.IO.Packaging名前空間もこれに役立つとコメントしているようです。誰でもそれを行う方法を正確に知っていますか?
解決
MSDNには完全な例 < a href = "http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx" rel = "noreferrer"> http://msdn.microsoft.com/en-us/ library / system.io.packaging.zippackage.aspx をZipPackageクラスを使用して。 .NET 3.5が必要です。
他のヒント
デイブ、とてもいい!!そこにあるとは知りませんでした。
これで何を探すべきかがわかったので、使用方法に関する小さなコードサンプルを含む記事を見つけることができました。 http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx
関連するメモでは、非常に使いやすい DotNetZipプロジェクトも見つかりました。
.NETの*** Streamクラスを使用すると、圧縮されたバイトストリームを読み書きできます。これらのクラスは、zipファイルの読み取りまたは書き込みを行いません。 zipファイルは、「エンベロープ」で囲まれた圧縮データです。またはヘッダー。それをメタデータと考えてください-ファイルの名前、タイムスタンプ、CRC、およびその他のものが含まれています。 ** Streamクラスは、圧縮データのストリームのみを生成し、メタデータを生成または消費する方法を知りません。これは、PKWareが管理するPKZip形式仕様で説明されています。
DotNetZipなどのサードパーティライブラリは、ZIPアーカイブ内のメタデータを処理します。 System.IO.Compression.DeflateStream()クラスを使用して、圧縮されたバイトストリームを生成する場合としない場合があります。たとえば、以前のリリースでは、DotNetZipは組み込みのDeflateStreamを使用していました。 v1.7の時点で、DotNetZipには独自のDeflateStreamが含まれており、.NET Frameworkに同梱されているものよりも効率的です。追加の利点として、DotNetZipに埋め込まれたDeflateStreamにより、System.IO.Compression.DeflateStreamのない.NET Compact Framework 2.0でDotNetZipを使用できます。 (Compact Framework 3.5で追加されました)
さらに質問がある場合は、DotNetZipサイトに良いフォーラムがあります。 C#コードの例:
try
{
using (ZipFile zip = new ZipFile())
{
zip.AddDirectory(DirectoryToZip); // recurses subdirs
zip.Save(Filename);
}
}
catch (System.Exception ex1)
{
System.Console.Error.WriteLine("exception: " + ex1);
}
.NET 4.5以降、Microsoftは ZipArchive クラスを System.IO.Compression
名前空間に追加します。ただし、 GZipStream
や Deflate
ストリームなど、その名前空間の他のクラスとは異なり、 ZipArchive
は System.IOへの参照を必要とします。 Compression.dll アセンブリ。
使用するのは非常に簡単で、MSDNへの上記のリンクはいくつかの良い例を提供します。
さらに、Microsoftは Microsoft Compression NuGetパッケージを作成しました。 ZipArchive
およびWindows Phone 8およびその他のポータブルクラスライブラリの関連クラスのサポート
古いスレッドは知っていますが、.NET 4.5がsystem.io.compressionに大幅な改善を加えたことを指摘したいと思います。 .zipファイルを非常にうまく処理できるようになりました。zip内の個々のファイルをストリーム対応として公開したり、ファイルを抽出および圧縮するステップなしで読み書きできるようになります。
はい、過去に使用しました。永続化をサポートするために、 DataSet を1回サブクラス化しました。ファイルへの出力( ReadXML を介して/ WriteXML メソッド)。追加のボーナスとして、必要に応じてオプションで圧縮できるようにすることにしました(これは、ご存知のとおり、XMLのようなテキストデータに対して非常に効果的です)。
GZipStream クラスを使用しました(関連する DeflateStream はヘッダー情報のない単なるGZip、またはそのようなものです(&#8212;誰かがこれを修正できると確信しています)。別のストリームの上にピギーバッキングすることで非常に簡単に機能するため、その場所でGZipStreamを使用します。私の場合、FileStreamに便乗していました。
MemoryStream を入力します myDataSet.WriteXML()
の出力、次のようなことをしました:
if (CompressData)
{
// Write to memory
mStream = new MemoryStream();
Save(mStream);
mStream.Seek(0, SeekOrigin.Begin);
// Filter that through a GZipStream and then to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
FileMode.OpenOrCreate);
zipStream = new GZipStream(fStream, CompressionMode.Compress, true);
Pump(mStream, zipStream);
}
else
{
// Write straight to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
FileMode.OpenOrCreate);
Save(fStream);
}
Save()
および Pump()
は次のような単純なメソッドです:
private void Pump(Stream input, Stream output)
{
int n;
byte[] bytes = new byte[4096]; // 4KiB at a time
while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
{
output.Write(bytes, 0, n);
}
}
public void Save(Stream stream)
{
AcceptChanges();
WriteXml(stream, XmlWriteMode.WriteSchema);
}
public static void zIpDatabseFile(string srcPath, string destPath)
{//This is for Zip a File
using (var source = new FileStream(srcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
using (var dest = new FileStream(destPath, FileMode.OpenOrCreate, FileAccess.Write))
using (var zip = new GZipStream(dest, CompressionMode.Compress))
{
source.CopyTo(zip);
}
}
public static void uNzIpDatabaseFile(string SrcPath, string DestPath)
{// This is for unzip a files.
using (var source = new FileStream(SrcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
using (var dest = new FileStream(DestPath, FileMode.OpenOrCreate, FileAccess.Write))
using (var zip = new GZipStream(source, CompressionMode.Decompress))
{
zip.CopyTo(dest);
}
}