文件已被另一个进程使用

File is already in use by another process

我对以下代码 C# 有疑问,我必须通过电子邮件发送由报表查看器生成的文件,但是当我发送电子邮件时,程序会生成异常,提示文件已被另一个进程使用。我该如何解决?我把代码和错误放在下面。

错误:

该进程无法访问 C:/Temp/ordine.pdf,因为它已被另一个进程使用!

C# 代码:

try
{
    string subPath = "C:/Temp/";
    if (!Directory.Exists(subPath))
    {
        Directory.CreateDirectory(subPath);
    }

    string filepath = "C:/Temp/ordine.pdf";
    byte[] bytes = reportViewerOrdine.LocalReport.Render("PDF", null);
    using (FileStream fs = new FileStream(filepath, FileMode.Create))
    {
        fs.WriteAsync(bytes, 0, bytes.Length);
        fs.Close();
    }

    //Invio l'email                
    MailMessage mail = new MailMessage();
    SmtpClient SmtpServer = new SmtpClient("mail.server.com");
    mail.From = new MailAddress(u.GetEmail());
    mail.To.Add(myemail);
    mail.Subject = "--";
    mail.Body = "--";
    System.Net.Mail.Attachment attachment;
    attachment = new System.Net.Mail.Attachment("C:/Temp/ordine.pdf");
    mail.Attachments.Add(attachment);
    SmtpServer.Port = 587;
    SmtpServer.Credentials = new System.Net.NetworkCredential(u.GetEmail(), u.GetPassword());
    SmtpServer.EnableSsl = false;
    SmtpServer.Send(mail);
    File.Delete(@"C:/Temp/ordine.pdf");
    MessageBox.Show("Email send");
}
catch (Exception ex)
{
    MessageBox.Show("Error: " + ex);
}

我遇到过许多 Excel 文件,但只要我将它们置于只读模式,它们就会起作用。试试这个:

FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

您根本不需要使用文件。您已经在字节数组中包含了附件内容,所以只需:

attachment = new System.Net.Mail.Attachment(new MemoryStream(bytes), "ordine.pdf" );

完全删除以下代码行:

string subPath = "C:/Temp/";
if (!Directory.Exists(subPath))
{
    Directory.CreateDirectory(subPath);
}

string filepath = "C:/Temp/ordine.pdf";

using (FileStream fs = new FileStream(filepath, FileMode.Create))
{
    fs.WriteAsync(bytes, 0, bytes.Length);
    fs.Close();
}

File.Delete(@"C:/Temp/ordine.pdf");