如何在C#中列出压缩文件夹的内容?例如,如何知道压缩文件夹中包含的项目数量,以及它们的名称是什么?
答案 0 :(得分:31)
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...
}
}
答案 1 :(得分:25)
.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);
}
}
答案 2 :(得分:21)
如果您使用的是.Net Framework 3.0或更高版本,请查看System.IO.Packaging Namespace。这将删除您对外部库的依赖性。
专门查看ZipPackage Class。
答案 3 :(得分:12)
ZipInputStream inStream = new ZipInputStream(File.OpenRead(fileName));
while (inStream.GetNextEntry())
{
ZipEntry entry = inStream.GetNextEntry();
//write out your entry's filename
}
答案 4 :(得分:6)
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);
}
}
答案 5 :(得分:4)
我在这里比较新,所以也许我不明白发生了什么。 :-) 这个帖子目前有4个答案,其中两个最佳答案已经被拒绝。 (Pearcewg和cxfx)pearcewg指出的文章非常重要,因为它澄清了SharpZipLib的一些许可问题。 我们最近评估了几个.Net压缩库,发现DotNetZip是目前最好的替代品。
非常简短的摘要:
System.IO.Packaging明显慢于DotNetZip。
SharpZipLib是GPL - 见文章。
首先,我对这两个答案进行了投票。
金。
答案 6 :(得分:4)
如果你像我一样并且不想使用外部组件,那么我昨晚使用.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方法
答案 7 :(得分:0)
最好的方法是使用.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#?。由于许可证要求,它们可能不合适。