2017-12-29 21 views
0

dbから詳細を取得し、FileHelperを使用してファイルに書き込んでいます。ファイルをメールの一部として添付し、メールの送信後にファイルを削除しようとします。FileHelperアセンブリで作成されたファイルを削除できません

var engine = new FileHelperEngine<DataModel>(); 

engine.WriteFile(filePath, data); 

//After Mail is sent, deleting the file. 
if (File.Exists(filePath)) 
{       
    File.Delete(filePath); //Error is thrown here 
} 

例外:別のプロセスによって使用されているため、プロセスはファイル「..//somefilepath」 にアクセスすることはできません。

メールが送信されるとすぐにこれらのファイルを削除しなければなりません。これらのファイルをサーバーに置くと、サーバー内のスペースが消費されます。

別のプロセスでこれらのファイルを削除するにはどうすればよいですか?

編集:皆様からのお返事ありがとうございます。 ファイルを保持していて、ファイルを削除することを許可していないAttachmentインスタンスが原因で問題が発生していました。

MailMessage mailobj= new MailMessage(); 
Attachment data = new Attachment(filePath); 
mailobj.Attachments.Add(data); 

//after sending mail, i disposed the data 
data.Dispose(); 
+2

使用中のファイルは削除できません。 Windowsはそれを許可しません。私はあなたがそれを試してみる前に少しずつ遅らせて試してみることをお勧めします。 – Bart

+3

_メールが送信されました_これは赤い旗を掲げています。このファイルを申し立てとして追加し、そのメール送信手続きの周りに_using文を使用していますか?メールを送信するコードを表示してください。 – Steve

+0

すべてを適切に処分してください。あなたのコードはすべての使い捨てオブジェクトを処分しているわけではないと思います。 'データ'を処分している間はコレクションに追加済みで、サーバーオブジェクトにメールの送信を依頼すると添付ファイルオブジェクトではなくそのファイルが開きます。 – netniV

答えて

1

問題のコードから問題が発生していません。 WriteFile()関数は、ファイルを自動的に開き、書き込みして閉じるので、ファイルは使用されません。メールクライアントは、ファイルを削除しようとしたときにファイルを使用している犯人です。それを削除しようとする前に、ファイルが終了してリリースされていることを確認してください。助けが必要な場合は、質問を編集し、メールを送信するためのコードを追加してください。

注:一部のメールクライアントでは、ファイルを正常に送信した後で自動的にファイルを削除できます。あなたのメールクライアントにその機能があり、それを有効にしているかどうかを確認してください。そのため、あなた自身でファイルを削除する必要はありません。

また、一部のメールクライアントはメモリストリームを受け入れます。メールクライアントがメモリストリームを受け入れる場合は、データをMemoryStreamに保存し、ファイルではなくメールクライアントに渡すことを検討することがあります。この方法で、ファイルの作成と削除を心配する必要はありません。

+0

あなたは正しいです。 FileHelperのWriteLine()ではありませんでした。ファイルを保持していたメールの送信の一環として、Attachmentインスタンスがありました。 –

+1

これを回答としてマークして、他の人がコメントを掘り下げずに知ることができます – netniV

2

ファイルにアクセス/リンクする別のプロセス(ローカルメールクライアントなど)がある場合は、File.Deleteの前にこのプロセスを閉じる必要があります。おそらく、直接ファイルを使用する代わりに、あなたが処分できるメモリにファイルをコピーするためにMemoryStreamを試してみてください。ファイルが別のプロセスで使用されていないことを確認してからFile.Deleteを実行できます。

関連する問題