我有文件(来自第三方)正在FTP到我们服务器上的目录.我下载它们并处理它们甚至'x'分钟.效果很好.
现在,一些文件是.zip文件.这意味着我无法处理它们.我需要先解压缩它们.
FTP没有zip/unzipping的概念 - 所以我需要抓取zip文件,解压缩然后处理它.
看看MSDN zip api,我似乎无法解压缩到内存流?
所以这是唯一的方法......
注意:文件的内容很小 - 比如4k < - > 1000k.
Mar*_*ell 64
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
// ...
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
通常情况下,你应该避免它复制到另一个流-只是用它"现况",但是,如果你绝对需要它的MemoryStream,你可以这样做:
using(var ms = new MemoryStream())
{
stream.CopyTo(ms);
ms.Position = 0; // rewind
// do something with ms
}
Run Code Online (Sandbox Code Playgroud)
您可以使用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());
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
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();
}
}
Run Code Online (Sandbox Code Playgroud)
看起来像这里是你需要的:
using (var za = ZipFile.OpenRead(path))
{
foreach (var entry in sa.Entries)
{
using (var r = new StreamReader(entry.Open()))
{
//your code here
}
}
}
Run Code Online (Sandbox Code Playgroud)