如何从zip文件中读取数据,而无需解压整个文件
反正.Net(C#)有没有解压缩完整的文件从压缩文件中提取数据?
简单地说,我可能想从zip文件的开头提取数据(文件),显然这取决于压缩algorithm是否以确定的顺序压缩文件。
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"); } }
使用.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中find“myfile”并解压。
如果你想使用SharpZipLib,像这样的东西将逐一列出和提取文件:
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压缩文件读入stringvariables(.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实用程序都应该有能力查询TOC。 或者你可以使用像7zip -t这样的命令行程序来打印目录并将其redirect到一个文本文件。
在这种情况下,您将需要parsingzip本地标头条目。 每个存储在zip文件中的文件都有一个本地文件头文件,它通常包含足够的解压缩信息。一般来说,你可以简单地parsingstream中的这些文件,select需要的文件,将头文件+压缩文件数据复制到其他文件文件,并调用该部分解压(如果你不想处理整个Zip解压缩代码或库)。