2

我正在使用 asp.net 3.5 和 c# 在 SharePoint 2010 中创建自定义计时器作业服务。在此服务中,业务逻辑是我必须创建包含应用程序列表的 zip 文件作为每个客户端的 excel 报告。为此,我使用 Ionic .zip 第三方 dll 和 ZipFile 类,用于创建 zip 文件并将此 zip 文件存储在具有某些路径的硬盘上。这里的情况是我的代码包含两个 foreach 循环,上部用于客户端列表,内部用于应用程序列表。每个客户端可能没有。应用程序。我将这些应用程序添加到 zip 文件中,将其存储在硬盘上并将此文件附加到邮件中以发送给客户端,但我的问题是我试图在转到下一个客户端之前删除 zip 文件,因此应该不是硬盘上的任何文件,但我收到错误为“

foreach(list of clients)////may have no. of clients
{
  string zipFileDownloadPath = String.Empty;
  foreach(list of applications)//may have no. of applications
  {
    HttpWebResponse resp = (HttpWebResponse)httpReq.GetResponse();
    Stream excelReport = resp.GetResponseStream();
    zipFile.AddEntry(appName, excelReport);
  }
  zipFileDownloadPath = clientFolder + @"\" + client["client_name"] + "_" + reportDate + ".zip";
  zipFile.Save(zipFileDownloadPath);
  mail.Attachments.Add(new Attachment(zipFileDownloadPath));
  smtp.Send(mail);//mail have body, subject etc.
  //here I am deleting files
  if (Directory.Exists(clientFolder))
  {
    Directory.Delete(clientFolder, true);//here I am getting error
  }
} 

在上面的代码中,我也尝试过将 zipfile 保存到输出流,这样就不需要在硬盘上存储文件并将此流附加到邮件附件,但问题是,我在输出流中得到了正确的字节但是发送邮件时,附件中的再见为零。//这是将输出流附加到邮件的代码

foreach(list of clients)////may have no. of clients
{

  foreach(list of applications)//may have no. of applications
  {
    HttpWebResponse resp = (HttpWebResponse)httpReq.GetResponse();
    Stream excelReport = resp.GetResponseStream();
    zipFile.AddEntry(appName, excelReport);
  }
  Stream outputStream = new MemoryStream();
  zipFile.Save(outputStream);
  mail.Attachments.Add(new Attachment(outputStream,"ZipFileName" MediaTypeNames.Application.Zip);));
  smtp.Send(mail);//mail have body, subject etc.
} 
4

2 回答 2

2

在将流发送到附件之前,尝试将流的位置移动到它的开头:

outputStream .Seek(0, SeekOrigin.Begin);

此外,在删除文件之前,请确保您处理了 zipFile 对象:

zipFile.Dispose()

或者(更好)将其包装在 using 语句中。

另外,除非我在使用流时遗漏了某些内容,否则为什么需要将文件保存到硬盘驱动器?只需使用流,类似于:

var ms = new new MemoryStream();
zipFile.Save(ms);
ms.Seek(0, SeekOrigin.Begin);
mail.Attachments.Add(new Attachment(ms,"ZipFileName" MediaTypeNames.Application.Zip));
zipFile.Dispose()
于 2013-10-15T14:40:29.427 回答
0

特别感谢 Luis.Luis 解决了我的问题。

大家好最后我解决了我的问题。问题是我将 zip 文件保存在输出流上,因此流正在读取确切的字节并到达它的最后一个位置,并且我将相同的流附加到附件,这就是为什么我在邮件附件中得到零字节的原因。所以解决方案是寻求在保存到 zip 文件后和附加到邮件之前开始输出流的位置。请参考以下代码以供参考。

Stream outputStream = new MemoryStream();
zipFile.Save(outputStream);
outputStream .Seek(0, SeekOrigin.Begin);
mail.Attachments.Add(new Attachment(outputStream,"ZipFileName" MediaTypeNames.Application.Zip);));
于 2013-10-18T12:46:07.863 回答