Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#和Zip文件操作_C#_.net_Zip - Fatal编程技术网

C#和Zip文件操作

C#和Zip文件操作,c#,.net,zip,C#,.net,Zip,以下是我想要的: 我需要打开一个zip文件的图像和迭代通过它的内容。首先,zip容器文件有子目录,其中一个“IDX”包含我需要的图像。我可以将zip文件内容解压缩到一个目录中。我的zip文件可能非常巨大,就像GBs一样巨大,因此我希望能够打开文件并在每次迭代处理图像时拉出图像 完成后,我只需关闭zip文件。这些图像实际上保存在一个数据库中 有人知道如何使用免费工具或内置api来实现这一点吗?此过程将在Windows计算机上完成 谢谢 是满足您需求的绝佳工具 我用它来处理巨型嵌套zip文件目录中的

以下是我想要的:

我需要打开一个zip文件的图像和迭代通过它的内容。首先,zip容器文件有子目录,其中一个“IDX”包含我需要的图像。我可以将zip文件内容解压缩到一个目录中。我的zip文件可能非常巨大,就像GBs一样巨大,因此我希望能够打开文件并在每次迭代处理图像时拉出图像

完成后,我只需关闭zip文件。这些图像实际上保存在一个数据库中

有人知道如何使用免费工具或内置api来实现这一点吗?此过程将在Windows计算机上完成

谢谢

是满足您需求的绝佳工具

我用它来处理巨型嵌套zip文件目录中的巨型文件(意思是zip文件中的zip文件),使用流。我能够在zip流的顶部打开一个zip流,这样我就可以研究内部zip的内容,而不必提取整个父级。然后,您可以使用流查看内容文件,这可以帮助您确定是否要提取它。它是开源的

编辑:库中的目录处理不理想。我记得,它包含一些目录的单独条目,而其他目录则由文件条目的路径暗示

下面是我用来收集特定级别(_startPath)的实际文件和文件夹名的代码摘录。如果您对整个包装器类感兴趣,请告诉我

// _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 );
}
/\u zipFile=您的zipFile实例
列表_folderNames=新列表();
列表_fileNames=nwe List();
字符串_startPath=“”;
常量字符串路径_分隔符=“/”;
foreach(zipFile中的ZipEntry条目)
{
string name=entry.name;
如果(_startPath!=“”)
{
if(name.StartsWith(_startPath+路径_分隔符))
name=name.Substring(_startPath.Length+1);
其他的
继续;
}
//忽略此文件夹下的项目
if(name.IndexOf(路径分隔符)!=name.LastIndexOf(路径分隔符))
继续;
字符串thisPath=null;
字符串thisFile=null;
if(entry.IsDirectory){
thisPath=name.TrimEnd(PATH_SEPARATOR.ToCharArray());
}
else if(entry.IsFile)
{
if(name.Contains(路径分隔符))
thisPath=name.Substring(0,name.IndexOf(PATH_分隔符));
其他的
thisFile=名称;
}
如果(!string.IsNullOrEmpty(thisPath)&&&!\u folderNames.Contains(thisPath))
_添加(此路径);
如果(!string.IsNullOrEmpty(此文件)&&&!\u fileNames.Contains(此文件))
_添加(此文件);
}

除了SharpZipLib(工作正常)之外,至少还有两个可行的选项:

  • Microsoft似乎正在研究将ZIP功能集成到
    System.IO
    命名空间中-有关更多信息,请参阅此


    • .NET不提供读取标准ZIP文件内容的方法。该类可以创建和读取包含特殊清单的zip文件。ZipPackage无法读取不包含此文件的文件,尽管zip实用程序可以轻松读取由ZipPackage创建的.zip文件。如果您是创建拉链的人,ZipPackage可能是一个选项。用于执行实际压缩和创建.zip文件的类是System.IO.Packaging的内部类,因此您不能直接使用它

      为了让您的员工相信没有OOTB方法可以打开标准ZIP,您应该提到.NET还提供了仅(反)压缩文件流内容的类。它不会将它们解释为单独的文件、目录等


      Jon Galloway在“”中介绍了所有选项,尽管没有一个选项比即将推出的System.IO.Zip更清晰

      哦,还有一件事,我所看到的是,在没有认真理由的情况下使用外部库,所以如果有一种方法可以通过本机API或托管代码实现这一点,那将是最好的。。有时搜索比问同样的问题更容易:PZipPackage只打开使用ZipPackage创建的文件。它无法打开标准文件是的,ZipPackage不能与任何Zip一起使用。我再次尝试,但是ZipEntry并没有一个条目列表可以在if-IsDirectory中迭代。对于这种类型的功能,文档最多是有限的。谢谢,但这根本不是我想要的。基本上,我希望能够在内存中迭代zipFile.GetEntity(“myFolder/”).Entities。你知道这是否可能是在SharpZipLib中吗?也许有一个误解,但这就是我对上述代码所做的。在这种情况下,_startPath将是“myFolder”,代码运行后,_foldername和_filename将包含该文件夹中实体的名称。然后,您可以使用这些列表来迭代内存中的实体(使用zipfile的方法按名称获取条目)。因此,我的理解是,只要我有zippedFileName,GetEntity()实际上会迭代所有子目录?编辑:没有。FindEntry()和GetEntry()不递归搜索子目录。。。