2010-05-18 49 views
14

Tôi đang sử dụng System.Net.Mail để gửi thư trong asp.net .. cách xóa tệp đính kèm sau khi gửi thư đính kèm .. tôi đã cố gắng sử dụng phương pháp File.Delete .. nhưng tôi nhận được lỗi này .. quá trình không thể truy cập đường dẫn tệp \ fun.jpg 'bởi vì nó đang được sử dụng bởi một quá trình khác. cảm ơn bạnxóa tệp đính kèm

Trả lời

26

Vứt bỏ MailMessage khi bạn thực hiện xong. Nó vẫn có một khóa trên tệp bạn đã thêm dưới dạng tệp đính kèm cho đến khi bạn làm như vậy.

var filePath = "C:\\path\\to\\file.txt"; 
var smtpClient = new SmtpClient("mailhost"); 
using (var message = new MailMessage()) 
{ 
    message.To.Add("[email protected]"); 
    message.From = new MailAddress("[email protected]"); 
    message.Subject = "Test"; 
    message.SubjectEncoding = Encoding.UTF8; 
    message.Body = "Test " + DateTime.Now; 
    message.Attachments.Add(new Attachment(filePath)); 
} 
if (File.Exists(filePath)) File.Delete(filePath); 
Console.WriteLine(File.Exists(filePath)); 

Output: False

Tôi tưởng tượng rằng nếu bạn vẫn có cái gì đó khóa các tập tin sau khi xử lý tin nhắn, mà bạn có thể có một khóa trên các tập tin, nhưng không có mã, chúng tôi không thể giúp đỡ bạn.

1

Bạn không thể xóa tệp được đính kèm sau khi gửi thư. Trước khi gửi, bạn có thể xóa.

Lỗi nói gì, đường dẫn bạn đã đề cập đang sử dụng một số quy trình khác.

MailMessage Message = new MailMessage(); 

Message.Subject = "Attachment Test"; 
Message.Body = "Check out the attachment!"; 
Message.To.Add("[email protected]"); 
Message.From = "[email protected]"; 

Message.Attachments.Add(new Attachment(memorystream, "test.txt", MediaTypeNames.Application.Text)); 

Lưu ý rằng chúng tôi đã tạo tệp đính kèm từ MemoryStream và chúng tôi đã đặt tên tệp đính kèm bất cứ điều gì chúng tôi muốn. Tên của tệp đính kèm trong tham số thứ hai là tên của tệp trong email chứ không phải tên trên ổ cứng hệ thống cục bộ. Trong thực tế các tập tin đính kèm không bao giờ đi vào ổ đĩa cứng của địa phương. Tham số thứ ba là kiểu Mime của phần đính kèm, trong trường hợp của chúng ta, đây là văn bản.

Chỉnh sửa: use Dispose() the mail

+0

tôi nghĩ rằng bạn cần phải vứt bỏ các đối tượng tập tin đính kèm. – anishMarokey

0

Mở rộng lớp MailMessage là một cách tốt để giải quyết này và giảm nguy cơ chạy vào vấn đề này một lần nữa ...

class MyMailMessage : MailMessage, IDisposable 
{ 
    private List<string> _tempFiles = new List<string>(); 

    public void Attach(string filename) 
    { 
     base.Attachments.Add(new Attachment(filename)); 
     this._tempFiles.add(filename); 
    } 

    new public void Dispose() 
    { 
     base.Dispose(); 
     this._tempFiles.Foreach(x => File.Delete(x)); 
    } 
} 

... và nhớ để sử dụng với một 'sử dụng' xây dựng (mà bạn nên sử dụng anyway) ...

using(SmtpClient client = GetMySmtpClient()) 
using(MyMailMessage msd = new MyMailMessage()) 
{ 
    msg.Attach(filename); 
    client.send(msg); 
} 
0

Bạn chỉ cần vứt bỏ đối tượng tin nhắn trước khi xóa tệp. Ví dụ:

Dim message As New MailMessage 
    message.From = New MailAddress(fromEmail, fromName) 
    message.Subject = subject 
    message.CC.Add(toCCEmail) 
    message.Bcc.Add(toBCCEmail) 
    Dim attach As Attachment = New Attachment(attachmentPath) 
    message.Attachments.Add(attach) 
    message.IsBodyHtml = True 
    message.Body = body 
    mailClient.Send(message) 

    message.Dispose() 'Add this line to dispose the message! 
0

Nếu email của bạn có rất nhiều File đính kèm

List<Attachments> lstAtt = new List<Attachments>(); 
Attachment att = new Attachment(file); 
lstAtt.Add(att); 

//finally 
foreach(var a in lstAtt) 
{ 
    a.Dispose(); 
} 

//delete file 
Các vấn đề liên quan