【问题标题】:How can I Read more info ZipEntry(s) inside of a ZipEntry with sharpZipLibrary?如何使用 sharpZipLibrary 阅读 ZipEntry 内的更多信息 ZipEntry(s)?
【发布时间】:2012-11-28 22:39:39
【问题描述】:

我必须列出 zip 文件中的所有可用信息(文件名、长度、创建日期、修改日期等)。我必须分析的一些 zip 文件包含其中的文件夹和 zip 文件以及其他文件类型。

我想知道如何读取 zip 文件中的这些文件夹和内容以及 zip 文件中的 zip 条目,而无需解压缩整个文件(如果可能的话)

例如:

集合.zip 文件1.txt 文件2.txt 报告/ 报告1.txt 报告2.txt 第一备份.zip 第二个备份.zip

使用Sharp zip 库,我可以通过以下方式读取第一层文件:

foreach (Zip_Library.Zip.ZipEntry entry in new Zip_Library.Zip.ZipFile(fi.FullName))
{
     printObjectProps(entry);
}

而 printObjectProps 看起来有点像这样:

    private static void printObjectProps(Object obj)
    {
        Console.WriteLine("--------------------------------------------");
        Console.WriteLine("ObjectType:" + obj.GetType().ToString());
        Console.WriteLine("--------------------------------------------");
        foreach (PropertyInfo propInfo in obj.GetType().GetProperties())
        {
            Console.WriteLine("PropertyName:" + propInfo.Name);
            Console.WriteLine("PropertyType:" + propInfo.PropertyType);
            Console.WriteLine("PropertyValue:" + propInfo.GetValue(obj, null));
            Console.WriteLine();
        }
        Console.WriteLine("--------------------------------------------");
    }

在我陷入更多麻烦之前我应该​​考虑什么想法?

【问题讨论】:

    标签: c# .net zip sharpziplib


    【解决方案1】:

    DotNetZip 会给你你想要的:

    http://dotnetzip.codeplex.com/

    使用起来既简单又简单。列出一个 zipfile 目录:

    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");  
      }
    }
    

    没有任何东西是未压缩的。它只是寻找文件的末尾,然后向后寻找目录/清单,然后读取它。

    如果你发现一个条目本身就是一个 zip 文件,并且你想探索它,很容易将它提取为一个临时文件并递归探索它,但如果我没记错的话,你可以


    编辑注释: DotNetZip 曾经住在 Codeplex。 Codeplex 已关闭。旧档案仍然 [可在 Codeplex 获得][1]。看起来代码已经迁移到Github了:


    【讨论】:

    • 但是如果压缩文件 A 包含压缩文件 B,那么如果不从 A 中提取,就无法读取 B 的内容,是吗?
    • @phoog。 AFAIK 那是正确的。但是,如果我没记错的话,DotNetZip 允许您将文件提取到 MemoryStream 中。此外,当存储在 zip 存档中时,已经压缩的文件不会再次被压缩:这会导致文件大小扩大。该算法检测到压缩文件并在没有[进一步]压缩的情况下存储它。
    • 感谢您的洞察力。希望其他人可以确认解压缩后必须读取“zip B”/或将其放入内存中,以便我们可以检查其中的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多