C#访问zip存档中的文本文件

C#访问zip存档中的文本文件,c#,zip,text-files,C#,Zip,Text Files,如何读取zip存档中文本文件的内容 例如,我有一个归档文件qwe.zip,并在其中插入一个文件asd.txt,那么我如何读取该文件的内容呢 可以不提取整个归档文件吗?因为它需要快速完成,当用户单击列表中的一个项目时,显示存档的描述(另一个程序的插件系统需要)。所以提取整个归档文件不是最好的解决方案。。。因为它可能只有几Mb,这至少需要几秒钟甚至更多的时间来提取。。。而只需要读取单个文件。您可以使用诸如或之类的库来解压缩文件并获取其中包含的各个文件的内容。此操作可以在内存中执行,您不需要将文件存储

如何读取zip存档中文本文件的内容

例如,我有一个归档文件qwe.zip,并在其中插入一个文件asd.txt,那么我如何读取该文件的内容呢


可以不提取整个归档文件吗?因为它需要快速完成,当用户单击列表中的一个项目时,显示存档的描述(另一个程序的插件系统需要)。所以提取整个归档文件不是最好的解决方案。。。因为它可能只有几Mb,这至少需要几秒钟甚至更多的时间来提取。。。而只需要读取单个文件。

您可以使用诸如或之类的库来解压缩文件并获取其中包含的各个文件的内容。此操作可以在内存中执行,您不需要将文件存储到临时文件夹中。

解压缩到临时文件夹获取文件并删除临时数据

    public static void Decompress(string outputDirectory, string zipFile)
    {
        try
        {
            if (!File.Exists(zipFile))
                throw new FileNotFoundException("Zip file not found.", zipFile);

            Package zipPackage = ZipPackage.Open(zipFile, FileMode.Open, FileAccess.Read);
            foreach (PackagePart part in zipPackage.GetParts())
            {
                string targetFile = outputDirectory + "\\" + part.Uri.ToString().TrimStart('/');
                using (Stream streamSource = part.GetStream(FileMode.Open, FileAccess.Read))
                {
                    using (Stream streamDestination = File.OpenWrite(targetFile))
                    {
                        Byte[] arrBuffer = new byte[10000];
                        int iRead = streamSource.Read(arrBuffer, 0, arrBuffer.Length);
                        while (iRead > 0)
                        {
                            streamDestination.Write(arrBuffer, 0, iRead);
                            iRead = streamSource.Read(arrBuffer, 0, arrBuffer.Length);
                        }
                    }
                }
            }
        }
        catch (Exception)
        {

            throw;
        }
    }

虽然在游戏后期,这个问题已经得到了回答,希望这对其他找到这个线索的人仍然有用,我想添加另一个解决方案

就在今天,当我想用C#检查ZIP文件的内容时,我遇到了类似的问题。除了NewProger,我不能使用第三方库,需要留在现成的.NET类中

您可以使用
System.IO.Packaging
命名空间和
ZipPackage
类。如果它尚未包含在程序集中,则需要添加对
WindowsBase.dll
的引用

然而,这个类似乎并不总是适用于每个Zip文件。调用
GetParts()
可能会返回一个空列表,尽管在QuickWatch窗口中可以找到一个名为
\u zipArchive
的属性,该属性包含正确的内容

如果是这种情况,您可以使用
反射
获取它的内容。
在geissingert.com上,您可以找到一篇博客文章(“”),其中给出了这方面的编码示例。

SharpZipLib或DotNetZip可能仍然需要获取/读取整个.zip文件才能解压缩文件。实际上,仍然有一种方法可以使您只从.zip文件中提取特殊文件,而不读取整个.zip文件,而只读取一小部分。

我需要深入了解Excel文件,我是这样做的:

using (var zip = ZipFile.Open("ExcelWorkbookWithMacros.xlsm", ZipArchiveMode.Update))
{
    var entry = zip.GetEntry("xl/_rels/workbook.xml.rels");
    if (entry != null)
    {
        var tempFile = Path.GetTempFileName();
        entry.ExtractToFile(tempFile, true);
        var content = File.ReadAllText(tempFile);
        [...]
    }
}

您可以在内存中解压并从中读取,或者在临时文件夹中在磁盘上执行操作查找SharpZipLib或DotNetZip(在codeplex上)Davide Piras,但是没有更简单的方法吗。。。?它可以很容易地做到,甚至在php。。。这太奇怪了,以至于无法从c#中的zip存档中读取文件。。。我不敢相信。。。