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

时间:2011-11-16 12:20:06

标签: c# zip text-files

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

例如我有一个存档qwe.zip,并且它有一个文件asd.txt,那么如何读取该文件的内容呢?

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

虽然在游戏后期且问题已经得到解答,但希望这对于找到此主题的其他人来说仍然有用,我想添加另一个解决方案。

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

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

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

如果是这种情况,您可以使用Reflection获取其内容。 在 geissingert.com 上,您可以找到一篇博客文章(“Getting a list of files from a ZipPackage”),为此提供编码示例。

答案 3 :(得分:0)

SharpZipLib或DotNetZip可能仍需要获取/读取整个.zip文件以解压缩文件。实际上,还有一种方法可以让你只是从.zip文件中提取特殊文件而不读取整个.zip文件而只是读取小段。

答案 4 :(得分:0)

我需要深入了解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);
        [...]
    }
}