26

メッセージ(多く)とその添付ファイルを送信する機能があります。

基本的にディレクトリ構造をループし、たとえばファイル構造から電子メールを作成します

 c:\emails\message01
                \attachments
 c:\emails\message02
                \attachments

メッセージの作成は、標準的なものである.net c#を使用して行われます。

すべてのメッセージが作成された後...メッセージフォルダを別の場所にコピーする直後に実行される別の関数があります。

問題は-ファイルがロックされている...

注:ファイルを移動するのではなく、コピーするだけです。

c#を使用してロックされたファイルをコピーする方法に関する提案はありますか?

アップデート

私はこれに添付ファイルを追加する方法があります

    private void AddAttachments(MailMessage mail)
    {
        string attachmentDirectoryPath = "c:\messages\message1";
        DirectoryInfo attachmentDirectory = new DirectoryInfo(attachmentDirectoryPath);
        FileInfo[] attachments = attachmentDirectory.GetFiles();
        foreach (FileInfo attachment in attachments)
        {
            mail.Attachments.Add(new Attachment(attachment.FullName));
        }
    }
4

5 に答える 5

58

電子メールメッセージを作成するためにファイルをどのように読んでいますか?それらは読み取り専用として開かれ、 ...にFileShare設定されFileShare.ReadWriteている必要があります。その後、ロックされるべきではありません。を使用している場合は、リソースが適切に破棄されるようFileStreamに、ロジックをキーワードでラップする必要もあります。using

アップデート:

メールメッセージ自体を破棄すると、その中のリソースが閉じられ、ファイルのロックが解除されると思います。

using (var mail = new MailMessage())
{
    AddAttachments(mail);
}
// File copy code should work here
于 2009-08-18T20:46:58.877 に答える
21

私自身の投稿に答えるのは嫌いですが、ここでこの問題を抱えている次の貧しい人にとっては、修正です:

メッセージを送信した後

        // Send the mail
        client.Send(message);

        //Clean up attachments
        foreach (Attachment attachment in message.Attachments)
        {
            attachment.Dispose();
        }

添付ファイルを破棄...ロックを解除しても、メッセージは添付ファイル付きで送信されます。Disposeはファイルを削除せず、添付ファイルをクリアするだけです:)

于 2009-08-18T21:14:25.483 に答える
3

読み終わったらファイルを閉じますか?読むためにそれらを開いたが、終わったときにそれらを閉じない場合、プログラムが終了してすべてのファイルを自動的に閉じるまで、それらをロックし続ける必要があります。

于 2009-08-18T20:48:00.780 に答える
2
    MailMessage email = new MailMessage();

    email.From = txtFrom.Text;
    email.To = txtToEmail.Text;
    email.Subject = txtMSubject.Text; 
    email.Body = txtBody.Text;

    SmtpClient mailClient = new SmtpClient();
    mailClient.Host = "smtp.emailAddress";
    mailClient.Port = 2525;
    mailClient.Send(email );
    email.Dispose();

    // After Disposing the email object you can call file delete

    if (filePath != "")
    {
      if (System.IO.File.Exists(filePath))
      {
        System.IO.File.Delete(filePath); 
      }
    }
于 2012-06-26T00:00:26.787 に答える
0

添付ファイルを送信するときにこれをよく目にします。私は通常、次のようなものを使用します。

ファイルを別の場所に移動するコードでは、次のパターンを使用できます。

ファイルをループするためのループ内

bool FileOk = false;
while (!FileOk)
{
   try
   {
      // code to move the file
      FileOk = true;
   }
   catch(Exception)
   {
      // do nothing or write some code to pause the thread for a few seconds.
   }

}
于 2009-08-18T20:51:13.283 に答える