我不确定自己在做什么错。抓取byte[](即emailAttachment.Body)并将其传递给方法ExtractZipFile,将其转换为MemoryStream然后解压缩,将其作为KeyValuePair返回,然后写入文件后,创建的文件使用FileStream

但是,当我打开新创建的文件时,打开它们时出错。它们无法打开。

以下是同班

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;
}


我有什么想念的吗?我不想保存原始的zip文件,而只是保存从MemoryStream中提取的文件。
我究竟做错了什么?

最佳答案

写入MemoryStream之后,您无需将位置重新设置为0:

MemoryStream memoryStream = new MemoryStream();
ent.Extract(memoryStream);
result.Add(ent.FileName,memoryStream);


因此,当您尝试从中读取流时,流的位置将位于末尾,而您将一无所获。确保倒带:

memoryStream.Position = 0;


另外,您不必手动处理副本。只需让CopyTo方法处理它:

extractedFile.Value.CopyTo(file);

关于c# - 如何从byte []转到MemoryStream,解压缩,然后写入FileStream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54992643/

10-13 07:06