【问题标题】:How do I decompress multiple files from a MemoryStream如何从 MemoryStream 解压缩多个文件
【发布时间】:2012-02-14 14:56:01
【问题描述】:

我正在下载一个压缩文件并使用以下代码解压:

 WebClient client = new WebClient();
 MemoryStream download = new MemoryStream(client.DownloadData(targetUrl));
 var data = new GZipStream(download, CompressionMode.Decompress, true);

从这里,我如何查看压缩存档中的文件并对其进行排序?我知道这个档案中的一个文件是我需要的,基于它的文件类型(.csv),我需要把它拿出来。这如何通过 c# 来完成?

【问题讨论】:

标签: c# asp.net gzip


【解决方案1】:

GZipStream 用于压缩和解压缩流...您不能使用它来压缩和解压缩多个文件。实际上,您可以,但您应该开发一些将这些文件合并到一个流中的方法,并且还知道如何使操作反向(从流中获取这些文件)。如果你有一个文件,你会这样做:

using (var outFile = File.Create(outputFileName))
{
    using (GZipStream gzip = new GZipStream(download, CompressionMode.Decompress))
    {
        var buffer = new byte[4096];
        var numRead = 0;
        while ((numRead = gzip.Read(buffer, 0, buffer.Length)) != 0)
        {
            outFile.Write(buffer, 0, numRead);
        }
    }
}

Here 是一篇描述如何使用 GZipStream 压缩/解压缩多个文件的文章,但正如您所见,作者开发了自己的“zip”格式来存储多个文件,并且使用 GZipStream 压缩单个流。

在您的情况下,如果您没有进行压缩,您很可能会收到标准 zip 文件,在这种情况下,您可以使用名为 SharpZipLib 的库来解压缩您的内容。

这里是一个使用 SharpZipLib 的例子

using (var s = new ZipInputStream(download))
{
    ZipEntry theEntry;
    while ((theEntry = s.GetNextEntry()) != null) 
    {
        string directoryName = Path.GetDirectoryName(theEntry.Name);
        string fileName      = Path.GetFileName(theEntry.Name);
        
        if(fileName == myFileName)
        {
            using (FileStream streamWriter = File.Create(theEntry.Name)) 
            {
                int size = 2048;
                byte[] data = new byte[2048];
                while (true) 
                {
                    size = s.Read(data, 0, data.Length);
                    if (size > 0) 
                    {
                        streamWriter.Write(data, 0, size);
                    } 
                    else 
                    {
                        break;
                    }
                }
            }
        }
    }
}

【讨论】:

  • 除了 GZipStream 之外,还有什么其他东西可以用来解压我的存档并访问我需要的文件吗?
【解决方案2】:

您是否从某个地方拉出一个 ZIP 文件并试图从存档中取出一个文件?

您可以使用 ZipPackage 类来执行此操作。

http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx

示例代码具体见GetPart方法:

http://msdn.microsoft.com/en-us/library/system.io.packaging.package.getpart.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多