如何从zip文件中读取数据而不必解压缩整个文件


Answers:


78

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:



9
+1。在幕后,DotNetZip在构造函数中的作用是查找zip文件中的“目录”,然后对其进行读取并填充条目列表。届时,如果您的应用程序在一个条目上调用Extract(),则DotNetZip会在zip文件中查找到正确的位置,然后仅对该条目解压缩数据。
Cheeso 2011年

114

使用.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");

在zip文件中找到“ myfile”并将其解压缩。


34
也可以使用entry.Open()来获取流(如果应该读取内容但不能将其写入文件)。
2014年

17
参考:System.IO.Compression.dllSystem.IO.Compression.FileSystem.dll
yzorg

18

如果要使用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文件中的内容


1
坦白地说,我看不到此链接如何回答问题。
Eugene Mayevski'Callback

10

以下是将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());

0

压缩文件具有目录。每个zip实用程序都应该能够仅查询TOC。或者,您可以使用7zip -t之类的命令行程序来打印目录并将其重定向到文本文件。


0

在这种情况下,您将需要解析zip本地标头条目。每个存储在zip文件中的文件都具有前面的Local File Header条目,(通常)该条目包含用于解压缩的足够信息。通常,您可以对流中的此类条目进行简单的解析,选择所需的文件,将header +压缩的文件数据复制到其他文件中文件,然后对该部分进行解压缩(如果您不想处理整个Zip解压缩代码或库)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.