2010-05-18 31 views
14

ASP.NET'de posta göndermek için System.Net.Mail kullanıyorum .. ek dosya olarak gönderildikten sonra ek dosya nasıl silinir .. File.Delete yöntemini kullanmayı denedim .. ama Bu hatayı alıyorum .. işlem başka bir işlem tarafından kullanıldığından \ dosya.wpg 'dosya yoluna erişemiyor. Teşekkür ederizek dosyayı sil

cevap

26

imha onunla bitirdiniz. Hala yapana kadar ek olarak eklediğiniz dosya üzerinde bir kilit vardır.

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)); 

Çıkışı: Yanlış

hayal ediyorum

hala büyük olasılıkla dosya üzerinde başka kilit var ama kodu olmadan, size yardımcı olamaz, bir şeyler mesajı elden sonra dosyayı kilitleme varsa o sen. MailMessage sınıfını genişletme

1

Posta gönderdikten sonra ekli bir dosyayı silemezsiniz. Göndermeden önce silebilirsiniz.

Hata ne diyor, belirtilen yol, başka bir işlem kullanıyor. Biz MemoryStream eki yarattı ve biz istediğiniz ek herhangi bir ad lazım

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)); 

dikkat edin. İkinci parametrede ekin adı, e-postadaki dosyanın adıdır, yerel sistem sabit sürücüsündeki ad değil. Aslında ek hiçbir zaman yerel sabit diske gitmez. Üçüncü parametre ekin Mime türüdür, bizim durumumuzda bu metin.

Düzenleme: MailMessage ait use Dispose() the mail

+0

varsa. – anishMarokey

0

... Bu çözmek ve tekrar bu sorun haline çalışan olasılığını azaltmak için iyi bir yoldur

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)); 
    } 
} 

... ve (a 'kullanarak' yapı ile kullanmayı unutmayın ki Eğer

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

sadece dosyayı silmeden önce mesaj nesneyi atmak gerek ...) zaten kullanılıyor olmalıdır. Örn:

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

Posta sürü Ekleri

i eki nesneleri atmak gerektiğini düşünüyorum
List<Attachments> lstAtt = new List<Attachments>(); 
Attachment att = new Attachment(file); 
lstAtt.Add(att); 

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

//delete file