如何将文件解压缩到.NET内存流?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我有来自第三方的文件被FTP'd到我们的服务器上的目录。我下载它们并处理它们,甚至'x'分钟。很棒。

现在,一些文件是.zip文件。这意味着我无法处理它们。我需要先解压缩它们。

FTP没有zip / unzipping的概念 - 所以我需要抓取zip文件,解压缩,然后处理。

看着MSDN的zip api,似乎没有办法可以解压缩到内存流?

所以是唯一的方法来做到这一点...

  1. 解压缩到一个文件(什么目录?需要一些-very-temp位置...)
  2. 阅读文件内容
  3. 删除文件。

注:该文件的内容很小 - 比如4k < - > 1000k。

提问于
用户回答回答于

Zip压缩支持内置于:

using System.IO;
using System.IO.Compression;
// ^^^ requires a reference to System.IO.Compression.dll
static class Program
{
    const string path = ...
    static void Main()
    {
        using(var file = File.OpenRead(path))
        using(var zip = new ZipArchive(file, ZipArchiveMode.Read))
        {
            foreach(var entry in zip.Entries)
            {
                using(var stream = entry.Open())
                {
                    // do whatever we want with stream
                    // ...
                }
            }
        }
    }
}

通常情况下,你应该避免它复制到另一个流-只是用它“现况”,但是,如果你绝对需要它MemoryStream,你可以这样做:

using(var ms = new MemoryStream())
{
    stream.CopyTo(ms);
    ms.Position = 0; // rewind
    // do something with ms
}
用户回答回答于

可以使用ZipArchiveEntry.Open获取流。

此代码假定zip存档文件具有一个文本文件。

using (FileStream fs = new FileStream(path, FileMode.Open))
using (ZipArchive zip = new ZipArchive(fs) )
{
    var entry = zip.Entries.First();

    using (StreamReader sr = new StreamReader(entry.Open()))
    {
        Console.WriteLine(sr.ReadToEnd());
    }
}

扫码关注云+社区