C# ZipArchive.CreateEntryFromFile()无法将磁盘上的文件添加到压缩包中

4

我在 .NET 4.5 中有以下代码来使用 SmtpClient 发送邮件附件。我将以下创建的内存流添加到消息的附件集合中。

using System.IO;
using System.IO.Compression;

var memoryStream = new MemoryStream();
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
    archive.CreateEntryFromFile(@"c:\Files\File1.txt", "File1.txt");
}

当我收到一封电子邮件时,它显示为zip文件,但档案中没有File1.txt。这里缺少什么?
3个回答

0

我曾经遇到过同样的问题,我的解决方法是:

 using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, false)) {
       archive.CreateEntryFromFile(udf.FilePath, Path.GetFileName(udf.FilePath));
 }

在ZipArchive中使用了"false",在电子邮件部分我做了:

mail.Attachments.Add(new Attachment(new MemoryStream(ai.Stream.ToArray()), ai.AttachedFilename, ai.MediaType));

我新增了一个类似 new MemoryStream(ai.Stream.ToArray()) 的流,现在电子邮件的附件已经正常了。


0

我在一个程序中有一个类似的情况,需要在MemoryStream中创建Zip文件。正如Jack Bradford所提到的那样,执行Close/Dispose操作非常重要,但还有一些棘手的问题:

首先,您不能关闭/处理MemoryStrean,因为您需要它处于打开状态才能通过电子邮件附件发送它。

其次,您不能关闭/处理ZipArchive。其底层逻辑将在MemoryStream对象中执行Close操作。

第三,通常在写入MemoryStream对象后,指针会留在流的末尾。如果您尝试从中读取,您将读取0字节。这可能是您收到空zip文件的原因。

解决方案是将MemoryStream光标设置为流的开头,这样您的下一个读取操作就可以获取所有数据:

  memoryStream.Position = 0;
  <Mail code>
  System.Net.Mime.ContentType ct = new    System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Application.Zip);
  System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(memoryStream,"ZipFile.zip", ct.MediaType);
   <Add attachment to email and send email>
   <Stream and Zip Close/Dispose operations>

-5

请确保释放ZipArchive并关闭MemoryStream。

var memoryStream = new MemoryStream();
    using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
    {
         archive.CreateEntryFromFile(@"c:\Files\File1.txt", "File1.txt");
    }

archive.Dispose();
memoryStream.Close();

//Send Email

7
using语句用于处理存档的释放,建议使用两个using语句,一个用于包装当前using语句周围的memoryStream(缺失)。 - Tommy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接