.net C#和Zip文件操作

qco9c6ql  于 2022-12-20  发布在  .NET
关注(0)|答案(3)|浏览(134)

这是我正在寻找的:
我需要打开一个zip文件的图像和迭代通过它的内容。首先,zip容器文件有子目录和一个"IDX"房子的图像我需要。我没有问题解压文件内容到一个目录。我的zip文件可以令人难以置信的巨大,在GB巨大,因此我希望能够打开文件并拉出图像,因为我一次迭代通过它们来处理它们。
在我完成之后,我只需要关闭zip文件。这些图像实际上被保存在一个数据库中。
有没有人知道如何用免费的工具或内置的api来做这件事?这个过程将在Windows机器上完成。
谢谢!

oknwwptz

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

hmtdttj42#

除了SharpZipLib(运行良好)之外,至少还有两个更可行的选择:

5hcedyr0

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那样干净。

相关问题