我遇到删除创建文件的问题,只是为了发送带附件的电子邮件,然后在浏览器中查看。现在我需要删除此文件,因为这是为了发送电子邮件而创建的。我怎么能这样做。
这是我到目前为止所得到的。
public void SendEmail()
{
EmailClient.Send(mailMessage);
//View PDF Certificate in Browser
ViewPDFinBrowser((string)fileObject);
DeleteGeneratedTempCertificateFile((string)fileObject));
}
public void ViewPDFinBrowser(string filePath)
{
PdfReader reader = new PdfReader(filePath);
MemoryStream ms = new MemoryStream();
PdfStamper stamper = new PdfStamper(reader, ms);
stamper.ViewerPreferences = PdfWriter.PageLayoutSinglePage | PdfWriter.PageModeUseThumbs;
stamper.Close();
Response.Clear();
Response.ContentType = "application/pdf";
Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
Response.OutputStream.Close();
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
public static void DeleteGeneratedTempCertificateFile(Object fileObject)
{
string filePath = (string)fileObject;
if (File.Exists(filePath))
{
File.Delete(filePath);
}
}
以下是我调用SendEmail()
时需要的步骤1)发送附件附件的电子邮件 - >临时文件已创建 2)在浏览器中查看临时文件 3)删除临时文件
我可以理解,只要文件在响应对象中,我就无法对它做任何事情,因为我收到错误消息("另一个进程使用的文件)。如果我关闭响应流,那么文件将被删除,但之后我无法在浏览器中查看它。
我在想如果我可以设法以某种方式打开文件,在按钮单击的新窗口中在浏览器中查看,我将能够删除该文件。 要么 我想我可以在10分钟后删除该文件。因为用户不会在现场查看PDF超过1-2分钟。
请通过示例代码告诉我一个解决方案。
感谢您的时间和帮助。
答案 0 :(得分:1)
正如其他人所说,最好不要将临时文件写入磁盘,而是使用MemoryStream。有时第三方组件的实现不允许这样做,在这种情况下,在写完PDF文件的二进制内容之后,一定要调用close(和/或可能配置,总是检查MSDN或第三方API文档是什么.Close ()实际上)对所有不再需要的流。在您的情况下,在完成http请求后关闭 ms 和 reader 。
在大多数情况下,请考虑实施使用模式。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/aa664736.aspx。但是请记住,这种方法也存在一些警告,例如在WCF客户端中可能导致异常(因此实际上并未处理using子句中的所有内容)。
另外,请记住任何并发问题。保持临时文件名随机,并考虑本地磁盘上已存在文件的情况(即操作失败,不向请求者不应看到的请求发送二进制文件等)。