【问题标题】:The process cannot access the file filename because it is being used by another process该进程无法访问文件文件名,因为它正被另一个进程使用
【发布时间】:2015-09-30 10:22:27
【问题描述】:

我正在使用此代码生成 PDF:

foreach (var emp in empList)
{
    ....    
    Byte[] bytes;
    using (var ms = new MemoryStream())
    {

        //Create an iTextSharp Document which is an abstraction of a PDF but **NOT** a PDF
        using (var doc = new Document())
        {

            //Create a writer that's bound to our PDF abstraction and our stream
            using (var writer = PdfWriter.GetInstance(doc, ms))
            {
                //Open the document for writing
                doc.Open();

                using (var htmlWorker = new iTextSharp.text.html.simpleparser.HTMLWorker(doc))
                {

                    //HTMLWorker doesn't read a string directly but instead needs a TextReader (which StringReader subclasses)
                    using (var sr = new StringReader(EmailBody))
                    {

                        //Parse the HTML
                        htmlWorker.Parse(sr);
                    }
                }

                doc.Close();
            }
        }

        bytes = ms.ToArray();
    }

    bool isexist = System.IO.Directory.Exists(Server.MapPath("~/" + Session["SchemaName"].ToString() + "/HRLetters"));
    if (!isexist)
    {
        System.IO.Directory.CreateDirectory(Server.MapPath("~/" + Session["SchemaName"].ToString() + "/HRLetters"));
    }
    System.IO.File.WriteAllBytes(Server.MapPath("~/" + Session["SchemaName"].ToString() + "/HRLetters/" + emp.Code.ToString() + ".pdf"), bytes.ToArray());
}

然后我使用此代码通过邮件将所有 PDF 文件作为附件发送:

.......
SmtpClient smtp = new SmtpClient
                {
                    Host = data.SMTPServer, // smtp server address here...                    
                    Port = data.PortNo,
                    EnableSsl = data.SSL,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    Credentials = new System.Net.NetworkCredential(senderID, senderPassword),
                    Timeout = 30000,
                };
                Thread th = new Thread(() => { smtp.Send(message); });
                th.Start();

最后我尝试删除文件夹:

if (System.IO.Directory.Exists(Server.MapPath("~/" + Session["SchemaName"].ToString())))
{
    System.IO.Directory.Delete(Server.MapPath("~/" + Session["SchemaName"].ToString()), true);
}

我得到错误:

进程无法访问文件“001.pdf”,因为它正在 被另一个进程使用。

如何解决这个问题?这是因为发送邮件时线程正在运行吗?

【问题讨论】:

  • 你是如何填充消息变量的? "smtp.Send(message);"
  • @Viru 知道它将如何帮助解决问题?
  • 好的..可能是我读错了代码...我以为您正在使用文件内容填充消息变量,并且可能在读取文件后打开了一些流,但无论如何再次读取您的代码很清楚,消息只不过是电子邮件中的一些内容,而不是文件内容。

标签: c# asp.net-mvc pdf


【解决方案1】:

当您尝试在主线程中删除 pdf 文件时,某些句柄仍然打开。您应该在发送线程中删除它们

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多