如何从 byte[], 到 MemoryStream, Unzip, 然后写到 FileStream
How to go from byte[], to MemoryStream, Unzip, then write to FileStream
我不确定我做错了什么。我在抓取 byte[]
(即 emailAttachment.Body)并将其传递给 ExtractZipFile 方法后创建的文件,将其转换为 MemoryStream
然后解压缩,将其作为 [=13] 返回=] 然后使用 FileStream
写入文件。
但是当我去打开新创建的文件时,打开它们时出现错误。它们无法打开。
以下同在class
using Ionic.Zip;
var extractedFiles = ExtractZipFile(emailAttachment.Body);
foreach (KeyValuePair<string, MemoryStream> extractedFile in extractedFiles)
{
string FileName = extractedFile.Key;
using (FileStream file = new FileStream(CurrentFileSystem +
FileName.FileFullPath(),FileMode.Create, System.IO.FileAccess.Write))
{
byte[] bytes = new byte[extractedFile.Value.Length];
extractedFile.Value.Read(bytes, 0, (int) xtractedFile.Value.Length);
file.Write(bytes,0,bytes.Length);
extractedFile.Value.Close();
}
}
private Dictionary<string, MemoryStream> ExtractZipFile(byte[] messagePart)
{
Dictionary<string, MemoryStream> result = new Dictionary<string,MemoryStream>();
MemoryStream data = new MemoryStream(messagePart);
using (ZipFile zip = ZipFile.Read(data))
{
foreach (ZipEntry ent in zip)
{
MemoryStream memoryStream = new MemoryStream();
ent.Extract(memoryStream);
result.Add(ent.FileName,memoryStream);
}
}
return result;
}
有什么我想念的吗?我不想只保存从 MemoryStream
中提取的文件的原始 zip 文件。
我做错了什么?
写入 MemoryStream 后,您没有将位置设置回 0:
MemoryStream memoryStream = new MemoryStream();
ent.Extract(memoryStream);
result.Add(ent.FileName,memoryStream);
因此,当您尝试从流中读取时,流位置将位于末尾,您什么也读不到。确保倒带:
memoryStream.Position = 0;
此外,您不必手动处理副本。让 CopyTo
方法处理它:
extractedFile.Value.CopyTo(file);
我建议您清理代码中对 MemoryStream
的使用。
我同意调用 memoryStream.Position = 0;
将允许此代码正常工作,但在读取和写入内存流时很容易错过。
最好编写避免错误的代码。
试试这个:
private IEnumerable<(string Path, byte[] Content)> ExtractZipFile(byte[] messagePart)
{
using (var data = new MemoryStream(messagePart))
{
using (var zipFile = ZipFile.Read(data))
{
foreach (var zipEntry in zipFile)
{
using (var memoryStream = new MemoryStream())
{
zipEntry.Extract(memoryStream);
yield return (Path: zipEntry.FileName, Content: memoryStream.ToArray());
}
}
}
}
}
那么您的调用代码将如下所示:
foreach (var extractedFile in ExtractZipFile(emailAttachment.Body))
{
File.WriteAllBytes(Path.Combine(CurrentFileSystem, extractedFile.Path.FileFullPath()), extractedFile.Content);
}
只是代码少了很多,避免 bug 的机会也大了很多。代码中错误的第一预测因素是您编写的代码行数。
因为我发现它有很多代码用于简单的操作,所以这是我的两分钱。
using Ionic.Zip;
using (var s = new MemoryStream(emailAttachment.Body))
using (ZipFile zip = ZipFile.Read(s))
{
foreach (ZipEntry ent in zip)
{
string path = Path.Combine(CurrentFileSystem, ent.FileName.FileFullPath())
using (FileStream file = new FileStream(path, FileAccess.Write))
{
ent.Extract(file);
}
}
}
我不确定我做错了什么。我在抓取 byte[]
(即 emailAttachment.Body)并将其传递给 ExtractZipFile 方法后创建的文件,将其转换为 MemoryStream
然后解压缩,将其作为 [=13] 返回=] 然后使用 FileStream
写入文件。
但是当我去打开新创建的文件时,打开它们时出现错误。它们无法打开。
以下同在class
using Ionic.Zip;
var extractedFiles = ExtractZipFile(emailAttachment.Body);
foreach (KeyValuePair<string, MemoryStream> extractedFile in extractedFiles)
{
string FileName = extractedFile.Key;
using (FileStream file = new FileStream(CurrentFileSystem +
FileName.FileFullPath(),FileMode.Create, System.IO.FileAccess.Write))
{
byte[] bytes = new byte[extractedFile.Value.Length];
extractedFile.Value.Read(bytes, 0, (int) xtractedFile.Value.Length);
file.Write(bytes,0,bytes.Length);
extractedFile.Value.Close();
}
}
private Dictionary<string, MemoryStream> ExtractZipFile(byte[] messagePart)
{
Dictionary<string, MemoryStream> result = new Dictionary<string,MemoryStream>();
MemoryStream data = new MemoryStream(messagePart);
using (ZipFile zip = ZipFile.Read(data))
{
foreach (ZipEntry ent in zip)
{
MemoryStream memoryStream = new MemoryStream();
ent.Extract(memoryStream);
result.Add(ent.FileName,memoryStream);
}
}
return result;
}
有什么我想念的吗?我不想只保存从 MemoryStream
中提取的文件的原始 zip 文件。
我做错了什么?
写入 MemoryStream 后,您没有将位置设置回 0:
MemoryStream memoryStream = new MemoryStream();
ent.Extract(memoryStream);
result.Add(ent.FileName,memoryStream);
因此,当您尝试从流中读取时,流位置将位于末尾,您什么也读不到。确保倒带:
memoryStream.Position = 0;
此外,您不必手动处理副本。让 CopyTo
方法处理它:
extractedFile.Value.CopyTo(file);
我建议您清理代码中对 MemoryStream
的使用。
我同意调用 memoryStream.Position = 0;
将允许此代码正常工作,但在读取和写入内存流时很容易错过。
最好编写避免错误的代码。
试试这个:
private IEnumerable<(string Path, byte[] Content)> ExtractZipFile(byte[] messagePart)
{
using (var data = new MemoryStream(messagePart))
{
using (var zipFile = ZipFile.Read(data))
{
foreach (var zipEntry in zipFile)
{
using (var memoryStream = new MemoryStream())
{
zipEntry.Extract(memoryStream);
yield return (Path: zipEntry.FileName, Content: memoryStream.ToArray());
}
}
}
}
}
那么您的调用代码将如下所示:
foreach (var extractedFile in ExtractZipFile(emailAttachment.Body))
{
File.WriteAllBytes(Path.Combine(CurrentFileSystem, extractedFile.Path.FileFullPath()), extractedFile.Content);
}
只是代码少了很多,避免 bug 的机会也大了很多。代码中错误的第一预测因素是您编写的代码行数。
因为我发现它有很多代码用于简单的操作,所以这是我的两分钱。
using Ionic.Zip;
using (var s = new MemoryStream(emailAttachment.Body))
using (ZipFile zip = ZipFile.Read(s))
{
foreach (ZipEntry ent in zip)
{
string path = Path.Combine(CurrentFileSystem, ent.FileName.FileFullPath())
using (FileStream file = new FileStream(path, FileAccess.Write))
{
ent.Extract(file);
}
}
}