2012-02-08 3 views
5

は私のように定義された関数で生成されたファイルの数を持っている:ファイルがSmtpClientによって添付ファイルとして送信された後に開かれているように見えます。ファイルを削除するにはどうしたらいいですか?

Public Function GeneratePDF(exportFileName As String) As String 
    Dim GeneratePath As String = FileSystem.CombinePath(standardDirectory, exportFileName & DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") & ".pdf") 
    If GenerateFile(GeneratePath) Then 
     Return GeneratePath 
    End If 
    Return String.Empty 
End Function 

これらのファイルは、すぐに印刷され、ファイルが自動的にディレクトリに保存されています。ファイルそのものは、実際のソフトウェアユーザーが使用するものではありません。私はファイルをタイムスタンプして、監査目的で一意に識別された状態に保ちます。

私は今、これらのファイルのいくつかを会社の外部にメールするという要件を受け取りました。誰かが、現在のファイル名がユーザーフレンドリーではないと訴えました。

Public Function GeneratePDF(exportFileName As String) As String 
    Dim GeneratePath As String = FileSystem.CombinePath(standardDirectory, exportFileName & DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") & ".pdf") 
    If GenerateFile(GeneratePath) Then 

     Dim friendlyFilePath As String = FileSystem.CombinePath(standardDirectory, GetFriendlyFileName(GeneratePath)) 
     System.IO.File.Copy(GeneratePath, friendlyFilePath) 

     Dim mailMsg As New System.Net.Mail.MailMessage 
     Dim smtp As New System.Net.Mail.SmtpClient 
     [Vast amount of code, which attaches friendlyFilePath to the email, then sends it] 

     System.IO.File.Delete(friendlyFilePath) 

     Return GeneratePath 
    End If 
    Return String.Empty 
End Function 

これはスロー:

だから、私はそうのように、そのまま私の監査証跡を残し、それを削除、その後、友好ファイルを電子メールで送信する、親しみやすい名前で、一時ディレクトリに生成されたファイルをコピーしようとしましたSystem.IO.IOExceptionの行にあるSystem.IO.File.Delete(friendlyFilePath)は、ファイルが電子メールで送信された後も使用されているためです。

私は電子メールコードを取り出しました。コピーと削除がうまくいくので、問題を引き起こす電子メールにファイルが添付されているようです。

私はまた、電子メールが送信されたことを確認して5分待ってから、コードを進めても、同じ例外がスローされます。

誰もこの問題を解決する方法を提案できますか?

+0

[膨大な量のコード]領域に、あなたが閉じていない何らかの種類のストリームがある可能性がありますか? –

答えて

7

SmtpClientは添付ファイルへのハンドルを解放しません。あなたは手動でそれを処理しなければなりません、あるいは、私がしているのは、まずファイルの内容をMemoryStreamにコピーすることです。以下のコードも同様に動作します。

using (MailMessage message = new MailMessage(from, to, subject, body)) 
using (Attachment attachment = new Attachment(fileName)) 
{ 
    message.Attachments.Add(attachment); 
    mailClient.UseDefaultCredentials = true; 
    mailClient.Send(message); 
} 
+0

メールメッセージの添付ファイルをすべて送信した後、手動で破棄します。問題を解決しました。ありがとう。 – Frosty840

3

ファイルにアクセスするときは、「使用」ステートメントを使用してください。これは、あなたのオブジェクトを処分し、あなたは(あなたのSystem.IO.File.Deleteを呼び出すことができるはずです)

はここを参照してください:あなたはそれを作成した後http://msdn.microsoft.com/en-us/library/htd05whh(v=vs.80).aspx

+0

これはより良い結果です...あなたが[使用している]として使用していない限り(なぜなら@ Nasirの解決策を使用します) –

0

は、あなたの添付ファイルを閉じていましたか?

System.IO.FileStream afile = System.IO.File.Create(@"c:\test\astream.csv"); 
afile.Close(); 
afile = null; 

this forumを参照してください。同様の質問が回答されました。 (これは、asp.netとC#でだが、vb.netに変換するとき、それはトリックを行う必要があります)

+0

削除されるファイルは 'System.IO.File.Copy'を使用して作成されるため、質問は適用されません。 – Frosty840

11

mailClient.Send(message);後、私は最後のポストを実現しながらこれは、添付ファイルのリソース

1

をリリースする予定message.Attachments.Dispose();

追加しますこの記事では、数年前に私はそれを認識していない人のための少量の追加情報を追加する価値があると思った...

電子メールを非同期で送信している場合は、コールバックが起動するまで、MailMessageインスタンスを■SendAsync()のUserStateパラメータ。こうすることで、コールバックが発生すると、添付ファイルとMailMessageインスタンスを処分することができます。また、送信者オブジェクトとしてメールクライアントを廃棄することもできます。

関連する問題