【问题标题】:How can I list the contents of a .zip folder in c#?如何在 c# 中列出 .zip 文件夹的内容?
【发布时间】:2008-11-21 03:47:00
【问题描述】:

如何在 C# 中列出压缩文件夹的内容?例如,如何知道压缩文件夹中包含多少项目,它们的名称是什么?

【问题讨论】:

  • 在 .NET 4.5 或更高版本的情况下,您不再需要 3rd 方库!请参阅下面的答案!

标签: c# list directory zip


【解决方案1】:

.NET 4.5 或更高版本最终具有内置功能,可以使用程序集 System.IO.Compression 中的 System.IO.Compression.ZipArchive 类 (http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive%28v=vs.110%29.aspx) 处理通用 zip 文件。不需要任何第三方库。

string zipPath = @"c:\example\start.zip";
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        Console.WriteLine(entry.FullName);
    }
} 

【讨论】:

  • 工作正常,开箱即用,无需 3rd 方组件。请务必添加引用 System.IO.Compression.dllSystem.IO.Compression.FileSystem.dll
【解决方案2】:

DotNetZip - .NET 语言中的 Zip 文件操作

DotNetZip 是一个小型、易于使用的类库,用于处理 .zip 文件。它可以使用 VB.NET、C#、任何 .NET 语言编写的 .NET 应用程序轻松创建、读取和更新 zip 文件。

读取 zip 的示例代码:

using (var zip = ZipFile.Read(PathToZipFolder))
{
    int totalEntries = zip.Entries.Count; 
    foreach (ZipEntry e in zip.Entries)
    {
        e.FileName ...
        e.CompressedSize ...
        e.LastModified...
    }
}

【讨论】:

    【解决方案3】:

    如果您使用的是 .Net Framework 3.0 或更高版本,请查看System.IO.Packaging Namespace。这将消除您对外部库的依赖。

    具体查看ZipPackage Class

    【讨论】:

    • 它消除了对外部库的依赖,但ZipPackage的可用性确实不是很好。一切都是权衡!
    • ZipPackage 主要用于处理那些内部为 zip 文件的 Microsoft 相关文件格式,例如:docxxlsxXPSnupkg...。从通用 zip 文件的角度来看,这些只是因为存在位于存档根目录中的 Content_Type.xml 文件而有所不同。如果您不能使用 .NET 4.5,但可以使用 .NET 3.0,那么 ZipPackage 可以是完美的,因为您可以生成和使用文件。
    • 对于 .NET 4.5 或更高版本,尽管应该使用 ZipArchive 类进行通用压缩,请参阅下面的答案
    【解决方案4】:

    签入SharpZipLib

    ZipInputStream inStream = new ZipInputStream(File.OpenRead(fileName));
    
    while (inStream.GetNextEntry())
    {
    
         ZipEntry entry = inStream.GetNextEntry();
         //write out your entry's filename
    }
    

    【讨论】:

      【解决方案5】:

      Ick - 使用 J# 运行时的代码太可怕了!而且我不同意这是最好的方法 - J# 现在不支持了。而且它是一个巨大的运行时,如果你想要的只是 ZIP 支持的话。

      这个怎么样 - 它使用DotNetZip(免费,MS-Public 许可证)

      using (ZipFile zip = ZipFile.Read(zipfile) )
      {
          bool header = true;
          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,9}  {3,5}   {4,9}  {5,3} {6,8} {0}",
                                           "Filename", "Modified", "Size", "Ratio", "Packed", "pw?", "CRC");
                  System.Console.WriteLine(new System.String('-', 80));
                  header = false;
              }
      
              System.Console.WriteLine("{1,-22} {2,9} {3,5:F0}%   {4,9}  {5,3} {6:X8} {0}",
                                       e.FileName,
                                       e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"),
                                       e.UncompressedSize,
                                       e.CompressionRatio,
                                       e.CompressedSize,
                                       (e.UsesEncryption) ? "Y" : "N",
                                       e.Crc32);
      
              if ((e.Comment != null) && (e.Comment != ""))
                  System.Console.WriteLine("  Comment: {0}", e.Comment);
          }
      }
      

      【讨论】:

        【解决方案6】:

        我在这里比较新,所以也许我不明白发生了什么。 :-) 该线程目前有 4 个答案,其中两个最佳答案已被否决。 (Percewg 和 cxfx) pearcewg 所指的文章很重要,因为它阐明了 SharpZipLib 的一些许可问题。 我们最近评估了几个 .Net 压缩库,发现 DotNetZip 是目前最好的替代方案。

        非常简短的总结:

        • System.IO.Packaging 比 DotNetZip 慢很多。

        • SharpZipLib 是 GPL - 请参阅文章。

        所以对于初学者来说,我对这两个答案投了赞成票。

        金。

        【讨论】:

        • GPL 本身专门解决了程序部分不是 GPL 代码“派生”的问题,以及它们独立许可的权利。我看不出 SharpZipLib 成为 GPL 是一个重大问题。
        • GC,你是说如果一个团体或组织对 GPL 有问题,那么这个团体就错了?还是您永远无法理解任何人会对 GPL 有意见?这并不难相信。媒体上充斥着昂贵的法律测试的故事。
        • 是的,GPL 是病毒式的。如果他正在制作商业闭源软件,并且他将他的代码链接到 GPL 库,那么他必须在 GPL 兼容许可下发布他的源代码。所以是的,SharpZibLib 是 GPL 的事实是一个重要的问题。
        • 这篇文章是:对其他答案的评论;关于许可的讨论(在任何情况下都很重要,但在这里不是唯一的,与问题无关);您如何投票的记录;和一些图书馆推荐。它不是什么:对“如何在 c# 中列出 .zip 文件夹的内容?”问题的答案。
        【解决方案7】:

        如果你和我一样不想使用外部组件,这里是我昨晚使用 .NET 的 ZipPackage 类开发的一些代码。

        var zipFilePath = "c:\\myfile.zip";
        var tempFolderPath = "c:\\unzipped";
        
        using (Package package = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
        {
            foreach (PackagePart part in package.GetParts())
            {
                var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/')));
                var targetDir = target.Remove(target.LastIndexOf('\\'));
        
                if (!Directory.Exists(targetDir))
                    Directory.CreateDirectory(targetDir);
        
                using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read))
                {
                    source.CopyTo(File.OpenWrite(target));
                }
            }
        }
        

        注意事项:

        • ZIP 存档的根目录中必须有一个 [Content_Types].xml 文件。这对我的要求来说不是问题,因为我将控制通过此代码提取的任何 ZIP 文件的压缩。关于[Content_Types].xml文件的更多信息,请参考:A New Standard For Packaging Your Data文章图13下方有示例文件。

        • 此代码使用 .NET 4.0 中的 Stream.CopyTo 方法

        【讨论】:

        【解决方案8】:

        最好的方法是使用 .NET 内置的 J# zip 功能,如 MSDN 中所示:http://msdn.microsoft.com/en-us/magazine/cc164129.aspx。在此链接中,有一个应用程序读取和写入 zip 文件的完整工作示例。对于列出 zip 文件(在本例中为 Silverlight .xap 应用程序包)内容的具体示例,代码可能如下所示:

        
        ZipFile package = new ZipFile(packagePath);
        java.util.Enumeration entries = package.entries();
        //We have to use Java enumerators because we
        //use java.util.zip for reading the .zip files
        while ( entries.hasMoreElements() )
        {
            ZipEntry entry = (ZipEntry) entries.nextElement();
        
            if (!entry.isDirectory())
            {
                string name = entry.getName();
                Console.WriteLine("File: " + name + ", size: " + entry.getSize() + ", compressed size: " + entry.getCompressedSize());
            }
            else
            {
                // Handle directories...
            }                        
        }
        

        Aydsman 有一个右指针,但有 problems。具体来说,您可能会发现打开 zip 文件的问题,但如果您打算创建 pacakges,这是一个有效的解决方案。 ZipPackage 实现了抽象的 Package 类并允许对 zip 文件进行操作。在 MSDN 中有一个如何做到这一点的示例:http://msdn.microsoft.com/en-us/library/ms771414.aspx。代码大致如下所示:

                     string packageRelationshipType = @"http://schemas.microsoft.com/opc/2006/sample/document";
                    string resourceRelationshipType = @"http://schemas.microsoft.com/opc/2006/sample/required-resource";
                    // Open the Package.
                    // ('using' statement insures that 'package' is
                    //  closed and disposed when it goes out of scope.)
                    foreach (string packagePath in downloadedFiles)
                    {
                        Logger.Warning("Analyzing " + packagePath);
                        using (Package package = Package.Open(packagePath, FileMode.Open, FileAccess.Read))
                        {
                            Logger.OutPut("package opened");
                            PackagePart documentPart = null;
                            PackagePart resourcePart = null;
        
                            // Get the Package Relationships and look for
                            //   the Document part based on the RelationshipType
                            Uri uriDocumentTarget = null;
                            foreach (PackageRelationship relationship in
                                package.GetRelationshipsByType(packageRelationshipType))
                            {
                                // Resolve the Relationship Target Uri
                                //   so the Document Part can be retrieved.
                                uriDocumentTarget = PackUriHelper.ResolvePartUri(
                                    new Uri("/", UriKind.Relative), relationship.TargetUri);
        
                                // Open the Document Part, write the contents to a file.
                                documentPart = package.GetPart(uriDocumentTarget);
                                //ExtractPart(documentPart, targetDirectory);
                                string stringPart = documentPart.Uri.ToString().TrimStart('/');
                                Logger.OutPut("  Got: " + stringPart);
                            }
        
                            // Get the Document part's Relationships,
                            //   and look for required resources.
                            Uri uriResourceTarget = null;
                            foreach (PackageRelationship relationship in
                                documentPart.GetRelationshipsByType(
                                                        resourceRelationshipType))
                            {
                                // Resolve the Relationship Target Uri
                                //   so the Resource Part can be retrieved.
                                uriResourceTarget = PackUriHelper.ResolvePartUri(
                                    documentPart.Uri, relationship.TargetUri);
        
                                // Open the Resource Part and write the contents to a file.
                                resourcePart = package.GetPart(uriResourceTarget);
        
                                //ExtractPart(resourcePart, targetDirectory);
                                string stringPart = resourcePart.Uri.ToString().TrimStart('/');
                                Logger.OutPut("  Got: " + stringPart);
                            }
        
                        }
                    }
        

        最好的办法似乎是使用J#,见MSDN:http://msdn.microsoft.com/en-us/magazine/cc164129.aspx

        本文中有指向更多具有不同许可证的 c# .zip 库的指针,例如 SharpNetZip 和 DotNetZip:how to read files from uncompressed zip in c#?。由于许可证要求,它们可能不适合。

        【讨论】:

        • 不,这不是最好的。 J# 运行时基于一个旧的 Java 库,zip 文件有错误,并且不再支持。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 2020-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多