1

重複の可能性:
添付ファイルを削除


次のコードで送信された後、ファイルを自動的に削除しようとしています:

        protected void btnSend_Click(object sender, EventArgs e)
        {
            //  Inserting attachment to the email
                using (Attachment data = new Attachment("C:\\local\\vCardGenerator.Website\\" + "FirstName_LastName.vcf", MediaTypeNames.Application.Octet))
            {

            //  add Send E-mail class
                SendvCard smtp = new SendvCard();

            //  Calls method to class
                smtp.MailvCard("anonymous@domain.com", "C:\\local\\vCardGenerator.Website" + "\\" + "FirstName_LastName" + ".vcf");
            }

            //  Status label + Delete file
            lblStatus.Text = "vCard Send to:" + " " + txtMail.Text;


//Delete file after being send as an attachment with the mail
            FileInfo DeleteFileInfo = new FileInfo("C:\\local\\vCardGenerator.Website" + "\\" + "FirstName_LastName" + ".vcf");
            if (DeleteFileInfo.Exists)
                File.Delete("C:\\local\\vCardGenerator.Website" + "\\" + "FirstName_LastName" + ".vcf");

「自動削除」なしのデバッグは完全にスムーズに実行され、添付ファイル付きの電子メールも送信されますが、送信後に添付ファイルを削除しようとすると、次のエラー ポップアップが表示されます。

プロセスはファイルにアクセスできません。(~\"Path") 別のプロセスで使用されているためです。

このエラーが発生する理由を知っている人はいますか?
最初にファイルを破棄する必要がありますか?

必要に応じて、その他の情報を喜んで提供します。

前もって感謝します、

4

3 に答える 3

4

メールメッセージを破棄すると、メッセージ内のリソースが閉じられ、ファイルのロックが解除されます

于 2012-11-02T12:42:35.147 に答える
1

SendvCardは .NET Framework の一部ではないため、確実なことは言えませんが、破棄MailMessageされるまで添付ファイルをロックするオブジェクトを内部で作成すると推測する危険があります。Attachmentまた、私が見る限り、使用されないため、不必要に新しいオブジェクトを作成しているように見えます。

必要なことは、添付ファイルを削除する前にsmtpオブジェクトを破棄することです。実装する場合、コードは次のようになります。SendvCardIDisposable

using (var smtp = new SendvCard())
{
    //  Calls method to class
    smtp.MailvCard("anonymous@domain.com", "C:\\local\\vCardGenerator.Website" + "\\" + "FirstName_LastName" + ".vcf");

}

//  Status label + Delete file
lblStatus.Text = "vCard Send to:" + " " + txtMail.Text;

//Delete file after being send as an attachment with the mail
FileInfo DeleteFileInfo = new FileInfo("C:\\local\\vCardGenerator.Website" + "\\" + "FirstName_LastName" + ".vcf");
if (DeleteFileInfo.Exists)
    File.Delete("C:\\local\\vCardGenerator.Website" + "\\" + "FirstName_LastName" + ".vcf");
于 2012-11-02T12:45:42.677 に答える
0

最初にファイルを必要としないAttachmentコンストラクターの1つを使用しました。私はMemoryStreamに書き込み、それを巻き戻してから、それをAttachmentに提供しました。

その後、新しいスレッドに関する別のエラーが発生しました。

必要がなかったのに、みんなの助けと答えに感謝します。

于 2012-11-02T13:39:36.447 に答える