8

以下のコードを使用して、コンテンツを含むローカル ドライブにファイルを作成しています。

File.WriteAllLines(path, contents);

このファイルをメールに添付して、チーム全体に送信しています。メールが送信されたら、ファイルを削除する必要があります。ファイルを削除するには、以下のコードを使用していますが、実行時エラーが発生しています

File.Delete(path);

エラーメッセージ: 別のプロセスで使用されているため、プロセスはファイルにアクセスできません

デフォルトでは、WriteAllLines() メソッドはファイルを閉じますが、別のプロセスによって開かれます。しばらくしてからコードを実行することによってのみファイルを削除できますが、これはシナリオではありません。メールを送信したら削除する必要があります。

アップデート

System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage();

       mailMessage.To.Add(new System.Net.Mail.MailAddress(recipient, ToName));

       mailMessage.From = new System.Net.Mail.MailAddress(From, FromName);
       mailMessage.Subject = Subject; // "Outlook calendar as attachment";  // modified by Srikanth J on 28/06/2012
       mailMessage.Body = "This is a test message";

       System.Net.WebClient webclient = new System.Net.WebClient();

       webclient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;

       for (int i = 0; i < item.Attachments.Count; i++)
       {
           string url = item.Attachments.UrlPrefix + item.Attachments[i];
           SPFile file = item.ParentList.ParentWeb.GetFile(url);
           mailMessage.Attachments.Add(new System.Net.Mail.Attachment(file.OpenBinaryStream(), file.Name));

       }

       System.Net.Mail.Attachment mailAttachment = new System.Net.Mail.Attachment(path);

       mailMessage.Attachments.Add(mailAttachment);
       smtp.Send(mailMessage);

どんな助けでも感謝します、ありがとう。

4

5 に答える 5

17

MailMessageimplementsIDisposableであるため、使いusing終わったらキーワードを使用してリソースを解放する必要があります。そうしないと、メッセージがもう使用されていないことにガベージ コレクターが気付くまで、ファイルが使用されたままになる可能性が非常に高くなります。

using (var mailMessage = new MailMessage())
{
   // set mailMessage properties
   // ...
   smtp.Send(mailMessage);
}

添付ファイルを直接呼び出すこともできますがDispose、メッセージを破棄すると、添付ファイルを含むすべてのサブオブジェクトが正しく破棄されることが保証されます。

于 2012-10-04T08:12:47.760 に答える
2

シンプルな Using ステートメントを

  System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage(); 

このように変化する

 using(System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage())
 {
       .......
        smtp.Send(mailMessage); 
 }

コードが using ステートメントから終了すると、mailMessage オブジェクトは、IDisposable インターフェイスを実装するすべてのオブジェクトと同様に破棄されます。つまり、Attachments コレクション内のすべての添付ファイルが破棄され、ファイルはロックされなくなります。

于 2012-10-04T08:13:27.570 に答える
1

これを行いたい場合は、ファイルではなくストリームにファイルを書き込むことをお勧めします。

そうすれば、ファイルのロックの問題を完全に回避できます。

ストリームに基づいて添付ファイルを設定する方法を示す例を次に示します (ストリーム自体を書き込むコードはここには示されていません)。

private static void SendReport(Report report)
{
    MailMessage msg = new MailMessage
    {
        From = new MailAddress(Configuration.EmailFrom),
        Subject = Configuration.EmailSubject,
        Body = Configuration.EmailBody
    };

    msg.To.Add(Configuration.EmailTo);

    if (!string.IsNullOrWhiteSpace(Configuration.EmailCC))
        msg.CC.Add(Configuration.EmailCC);

    if (!string.IsNullOrWhiteSpace(Configuration.EmailBcc))
        msg.Bcc.Add(Configuration.EmailBcc);

    Program.AttachReport(report, msg);

    SmtpClient smtp = new SmtpClient();
    smtp.Send(msg);
}

private static void AttachReport(Report report, MailMessage message)
{
    Stream stream = new MemoryStream();
    report.Save(stream, Configuration.SurveyName);
    message.Attachments.Add(new Attachment(stream, Configuration.AttachmentName, Configuration.AttachmentMediaType));
}
于 2012-10-04T07:59:00.430 に答える
1

これを試して

File.WriteAllLines(path, contents);
using(System.Net.Mail.MailMessage mailMessage 
                                = new System.Net.Mail.MailMessage())
{
// send mail containing the file here
}
File.Delete(path);

これがあなたを助けることを願っています。

于 2012-10-04T08:16:57.907 に答える
0

編集

try
{
  //send mail code
}
finally
{
  mailAttachment=null;
  mailMessage=null;
}
//delete file code 

最終的にメールを送信した後、ファイルハンドルを解放するか、ファイルを閉じることをお勧めします

try
{
  //attach file 
  //send mail
}
finally
{
  //set finally handle to null 
  // or close the file
}

//after this delete the file 
于 2012-10-04T07:44:11.990 に答える