这是我正在寻找的:我需要打开一个zip文件的图像和迭代通过它的内容。首先,zip容器文件有子目录和一个"IDX"房子的图像我需要。我没有问题解压文件内容到一个目录。我的zip文件可以令人难以置信的巨大,在GB巨大,因此我希望能够打开文件并拉出图像,因为我一次迭代通过它们来处理它们。在我完成之后,我只需要关闭zip文件。这些图像实际上被保存在一个数据库中。有没有人知道如何用免费的工具或内置的api来做这件事?这个过程将在Windows机器上完成。谢谢!
oknwwptz1#
SharpZipLib是满足您需求的绝佳工具。我用它来处理巨大的嵌套zip文件目录中的巨大文件(意思是ZIP文件中的ZIP文件),使用流。我能够在ZIP流 * 之上 * 打开一个ZIP流,这样我就可以调查内部ZIP的内容,而不必提取整个父文件。然后你可以使用流来窥视内容文件,这可能会帮助你决定是否要提取它。它是开源的。
**EDIT:**库中的目录处理并不理想。据我回忆,它包含一些目录的单独条目,而其他的则由文件条目的路径暗示。
下面是我用来在某个级别(_startPath)收集实际文件和文件夹名称的代码摘录。如果您对整个 Package 器类感兴趣,请告诉我。
// _zipFile = your ZipFile instance List<string> _folderNames = new List<string>(); List<string> _fileNames = nwe List<string>(); string _startPath = ""; const string PATH_SEPARATOR = "/"; foreach ( ZipEntry entry in _zipFile ) { string name = entry.Name; if ( _startPath != "" ) { if ( name.StartsWith( _startPath + PATH_SEPARATOR ) ) name = name.Substring( _startPath.Length + 1 ); else continue; } // Ignore items below this folder if ( name.IndexOf( PATH_SEPARATOR ) != name.LastIndexOf( PATH_SEPARATOR ) ) continue; string thisPath = null; string thisFile = null; if ( entry.IsDirectory ) { thisPath = name.TrimEnd( PATH_SEPARATOR.ToCharArray() ); } else if ( entry.IsFile ) { if ( name.Contains( PATH_SEPARATOR ) ) thisPath = name.Substring( 0, name.IndexOf( PATH_SEPARATOR ) ); else thisFile = name; } if ( !string.IsNullOrEmpty( thisPath ) && !_folderNames.Contains( thisPath ) ) _folderNames.Add( thisPath ); if ( !string.IsNullOrEmpty( thisFile ) && !_fileNames.Contains( thisFile ) ) _fileNames.Add( thisFile ); }
hmtdttj42#
除了SharpZipLib(运行良好)之外,至少还有两个更可行的选择:
System.IO
5hcedyr03#
.NET不提供读取标准ZIP文件内容的方法。System.IO.Packaging.ZipPackage类可以创建和读取包含特殊清单的zip文件。尽管zip实用程序可以轻松读取由ZipPackage创建的.zip,但ZipPackage无法读取不包含此文件的文件。如果您是创建zip的人,ZipPackage可能是一个选项,用于执行实际压缩和创建.zip文件的类是System.IO.packaging内部的,因此您不能直接使用它。为了让你的人相信没有OOTB的方式来打开标准的zip文件,你应该提到.NET还提供了System.IO.Compression.GZipStream类,它只压缩(解压缩)文件流的内容,而不会将它们解释为单独的文件、目录等。Jon Galloway在“Creating Zip archives in .NET (without an external library)“中涵盖了所有选项,尽管没有一个选项像即将推出的System.IO.Zip那样干净。
3条答案
按热度按时间oknwwptz1#
SharpZipLib是满足您需求的绝佳工具。
我用它来处理巨大的嵌套zip文件目录中的巨大文件(意思是ZIP文件中的ZIP文件),使用流。我能够在ZIP流 * 之上 * 打开一个ZIP流,这样我就可以调查内部ZIP的内容,而不必提取整个父文件。然后你可以使用流来窥视内容文件,这可能会帮助你决定是否要提取它。它是开源的。
**EDIT:**库中的目录处理并不理想。据我回忆,它包含一些目录的单独条目,而其他的则由文件条目的路径暗示。
下面是我用来在某个级别(_startPath)收集实际文件和文件夹名称的代码摘录。如果您对整个 Package 器类感兴趣,请告诉我。
hmtdttj42#
除了SharpZipLib(运行良好)之外,至少还有两个更可行的选择:
System.IO
命名空间中-请参阅此blog post了解更多信息5hcedyr03#
.NET不提供读取标准ZIP文件内容的方法。System.IO.Packaging.ZipPackage类可以创建和读取包含特殊清单的zip文件。尽管zip实用程序可以轻松读取由ZipPackage创建的.zip,但ZipPackage无法读取不包含此文件的文件。如果您是创建zip的人,ZipPackage可能是一个选项,用于执行实际压缩和创建.zip文件的类是System.IO.packaging内部的,因此您不能直接使用它。
为了让你的人相信没有OOTB的方式来打开标准的zip文件,你应该提到.NET还提供了System.IO.Compression.GZipStream类,它只压缩(解压缩)文件流的内容,而不会将它们解释为单独的文件、目录等。
Jon Galloway在“Creating Zip archives in .NET (without an external library)“中涵盖了所有选项,尽管没有一个选项像即将推出的System.IO.Zip那样干净。