とにかく、.Net(C#)には、完全なファイルを解凍せずにZipファイルからデータを抽出する方法がありますか?
単純に、Zipファイルの先頭からデータ(ファイル)を抽出したいだけです。明らかに、これは、圧縮アルゴリズムが決定的な順序でファイルを圧縮するかどうかに依存します。
DotNetZip はあなたの友達です。
簡単:
using (ZipFile Zip = ZipFile.Read(ExistingZipFile))
{
ZipEntry e = Zip["MyReport.doc"];
e.Extract(OutputStream);
}
(ファイルまたは他の宛先に抽出することもできます)。
Zipファイルの目次を読むのは簡単です:
using (ZipFile Zip = ZipFile.Read(ExistingZipFile))
{
foreach (ZipEntry e in Zip)
{
if (header)
{
System.Console.WriteLine("Zipfile: {0}", Zip.Name);
if ((Zip.Comment != null) && (Zip.Comment != ""))
System.Console.WriteLine("Comment: {0}", Zip.Comment);
System.Console.WriteLine("\n{1,-22} {2,8} {3,5} {4,8} {5,3} {0}",
"Filename", "Modified", "Size", "Ratio", "Packed", "pw?");
System.Console.WriteLine(new System.String('-', 72));
header = false;
}
System.Console.WriteLine("{1,-22} {2,8} {3,5:F0}% {4,8} {5,3} {0}",
e.FileName,
e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"),
e.UncompressedSize,
e.CompressionRatio,
e.CompressedSize,
(e.UsesEncryption) ? "Y" : "N");
}
}
編集後の注意:DotNetZipはCodeplexで使用されていました。 Codeplexはシャットダウンされました。古いアーカイブはまだ Codeplexで入手可能 です。コードがGithubに移行したようです:
.Net Framework 4.5( ZipArchive を使用):
using (ZipArchive Zip = ZipFile.Open(zipfile, ZipArchiveMode.Read))
foreach (ZipArchiveEntry entry in Zip.Entries)
if(entry.Name == "myfile")
entry.ExtractToFile("myfile");
Zipfileで「myfile」を見つけて展開します。
SharpZipLibを使用する場合は、次のようなものがファイルを1つずつリストおよび抽出します。
var Zip = new ZipInputStream(File.OpenRead(@"C:\Users\Javi\Desktop\myzip.Zip"));
var filestream = new FileStream(@"C:\Users\Javi\Desktop\myzip.Zip", FileMode.Open, FileAccess.Read);
ZipFile zipfile = new ZipFile(filestream);
ZipEntry item;
while ((item = Zip.GetNextEntry()) != null)
{
Console.WriteLine(item.Name);
using (StreamReader s = new StreamReader(zipfile.GetInputStream(item)))
{
// stream with the file
Console.WriteLine(s.ReadToEnd());
}
}
この例に基づいて: Zipファイル内のコンテンツ
以下に、UTF8テキストファイルをZipアーカイブから文字列変数(.NET Framework 4.5以降)に読み込む方法を示します。
string zipFileFullPath = "{{TypeYourZipFileFullPathHere}}";
string targetFileName = "{{TypeYourTargetFileNameHere}}";
string text = new string(
(new System.IO.StreamReader(
System.IO.Compression.ZipFile.OpenRead(zipFileFullPath)
.Entries.Where(x => x.Name.Equals(targetFileName,
StringComparison.InvariantCulture))
.FirstOrDefault()
.Open(), Encoding.UTF8)
.ReadToEnd())
.ToArray());
このような場合、Zipローカルヘッダーエントリを解析する必要があります。 Zipファイルに保存されている各ファイルには、(通常)解凍に十分な情報が含まれるローカルファイルヘッダーエントリが先行しています。一般に、ストリーム内のこのようなエントリの単純な解析、必要なファイルの選択、ヘッダー+圧縮ファイルデータのコピーファイルを作成し、その部分でunzipを呼び出します(Zip解凍コードまたはライブラリ全体を処理したくない場合)。
Zipファイルには目次があります。すべてのZipユーティリティには、TOCのみを照会する機能が必要です。または、7Zip -tなどのコマンドラインプログラムを使用して、目次を印刷し、テキストファイルにリダイレクトすることもできます。