2012-10-04 33 views
6

以下のコードを使用して、コンテンツを含むローカルドライブにファイルを作成しています。プロセスがファイルにアクセスできません。別のプロセスで使用されているためです。

私はこのファイルをメールに添付し、チームに送信しています。メールたら私はコードの下に使用していたファイルを削除するには、ファイルを削除する必要が送られたが、私はランタイムエラーを取得しています

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); 

すべてのヘルプがにappriciatedされて、ありがとうございます。私は最終的にあなたがこれをしたい場合は、私はあなたのファイルを書き込むことを示唆しているファイルハンドルをreleseか

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

//after this delete the file 
+1

ファイルをメールに添付するプロセスがまだファイルを保持しているようですか? –

+0

ファイルを添付するコードを投稿できますか? @CuongLeが提案したように、問題がある可能性が最も高いです。 –

+0

@CuongLeメールを送信した後でも、それはメールプロセスによってまだ保持されていますか? – Srikanth

答えて

14

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

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

また直接取り付けるためDisposeを呼び出すことができますが、メッセージを処分することは、既に正しく配置されます、添付ファイルを含むすべてのサブオブジェクトを、保証されます。

0

EDIT

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

ファイルではなくストリームへのファイルに変換します。

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

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

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)); 
} 
+2

'using'はもっと良いでしょう。 –

+0

@ L.B - はい、ここでそれを使うのは良いアイデアです。op doentがコードを提供しているので、私はこのためにsudoのコードを貼り付けました。 –

1

ファイルを閉じるにsendindメールの後に示唆

2

ただ、このよう

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

はMailMessageオブジェクトはすべてのオブジェクトと同様に配置されますusingステートメントからあなたのコード出口に変更するには、

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

にステートメントを使用して簡単なを追加IDisposableインターフェイスを実装しています。つまり、Attachmentsコレクションのすべての添付ファイルが破棄され、ファイルがロックされなくなります。

1

希望、これはuのに役立ちます。この

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

を試してみてください。

関連する問題