とにかく.Net(C#)には、ファイル全体を解凍せずにzipファイルからデータを抽出する方法はありますか?
単に私はおそらくzipファイルの最初からデータ(ファイル)を抽出したいだけです。明らかに、これは、圧縮アルゴリズムがファイルを確定的な順序で圧縮するかどうかに依存します。
とにかく.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」を見つけて抽出します。
System.IO.Compression.dll
およびSystem.IO.Compression.FileSystem.dll
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解凍コードまたはライブラリ全体を処理したくない場合)。