web-dev-qa-db-ja.com

ファイルを.NETメモリストリームに解凍するにはどうすればよいですか?

サーバー上のディレクトリにFTPで送信されているファイル(サードパーティ製)があります。それらをダウンロードし、「x」分でも処理します。よく働く。

現在、いくつかのファイルは.Zipファイル。つまり、それらを処理することはできません。最初にそれらを解凍する必要があります。

FTPにはZip/unzipの概念がありません。そのため、Zipファイルを取得して解凍し、処理する必要があります。

MSDN Zip api を見ると、メモリストリームに解凍できる方法はないようです。

これが唯一の方法です...

  1. ファイルに解凍します(どのディレクトリですか?-非常に一時的な場所が必要です...)
  2. ファイルの内容を読む
  3. ファイルを削除する。

注:ファイルの内容は小さく、たとえば4k <-> 1000kです。

29
Pure.Krome

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
}
61
Marc Gravell

ZipArchiveEntry.Open ストリームを取得します。

このコードは、Zipアーカイブに1つのテキストファイルがあることを前提としています。

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());
    }
}
9
dcastro

ここに必要なものがあります:

   using (var za = ZipFile.OpenRead(path))
   {
       foreach (var entry in sa.Entries)
       {
                using (var r = new StreamReader(entry.Open()))
                {
                    //your code here
                }
       }
   }
5
Uriil
  using (ZipArchive archive = new ZipArchive(webResponse.GetResponseStream()))
      {
      foreach (ZipArchiveEntry entry in archive.Entries)
          {
          Stream s = entry.Open();
          var sr = new StreamReader(s);
          var myStr = sr.ReadToEnd();
          }
      } 
4
Zia Khan