c#访问文本文件在zip存档

本文关键字:zip 存档 文件 访问 文本 | 更新日期: 2023-09-27 18:14:43

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

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

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

c#访问文本文件在zip存档

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

解压到temp文件夹中,删除temp-data

    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窗口中你可以找到一个名为_zipArchive的属性,它包含正确的内容。

如果这是您的情况,您可以使用Reflection来获取它的内容。在geissingert.com上,您可以找到一篇博客文章("从ZipPackage中获取文件列表"),其中给出了一个编码示例。

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);
        [...]
    }
}