サーバー上のディレクトリにFTPで送信されているファイル(サードパーティ製)があります。それらをダウンロードし、「x」分でも処理します。よく働く。
現在、いくつかのファイルは.Zip
ファイル。つまり、それらを処理することはできません。最初にそれらを解凍する必要があります。
FTPにはZip/unzipの概念がありません。そのため、Zipファイルを取得して解凍し、処理する必要があります。
MSDN Zip api を見ると、メモリストリームに解凍できる方法はないようです。
これが唯一の方法です...
注:ファイルの内容は小さく、たとえば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アーカイブに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());
}
}
ここに必要なものがあります:
using (var za = ZipFile.OpenRead(path))
{
foreach (var entry in sa.Entries)
{
using (var r = new StreamReader(entry.Open()))
{
//your code here
}
}
}
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();
}
}