2012-02-08 8 views
5

gibi tanımlanır bir fonksiyonu olarak üretilen dosyaları sahiptir:Dosya, SmtpClient tarafından ek olarak gönderildikten sonra açık tutuluyor gibi görünüyor. Dosyayı nasıl silebilirim?

Public Function GeneratePDF(exportFileName As String) As String 
    Dim GeneratePath As String = FileSystem.CombinePath(standardDirectory, exportFileName & DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") & ".pdf") 
    If GenerateFile(GeneratePath) Then 
     Return GeneratePath 
    End If 
    Return String.Empty 
End Function 

Bu dosyalar hemen basılır ve dosyaları otomatik bir dizine kaydedilir; dosyaların kendisi gerçek yazılım kullanıcıları tarafından kullanılmaz. Dosyaları denetim amacıyla benzersiz bir şekilde tanımlamak için dosyaları zamanladım.

Bu dosyalardan bazılarını şirkete harici olarak e-postayla göndermek için bir gereksinim aldım ve birisi geçerli dosya adlarının kullanıcı dostu olmadığını şikayet etti.

Public Function GeneratePDF(exportFileName As String) As String 
    Dim GeneratePath As String = FileSystem.CombinePath(standardDirectory, exportFileName & DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") & ".pdf") 
    If GenerateFile(GeneratePath) Then 

     Dim friendlyFilePath As String = FileSystem.CombinePath(standardDirectory, GetFriendlyFileName(GeneratePath)) 
     System.IO.File.Copy(GeneratePath, friendlyFilePath) 

     Dim mailMsg As New System.Net.Mail.MailMessage 
     Dim smtp As New System.Net.Mail.SmtpClient 
     [Vast amount of code, which attaches friendlyFilePath to the email, then sends it] 

     System.IO.File.Delete(friendlyFilePath) 

     Return GeneratePath 
    End If 
    Return String.Empty 
End Function 

Bu atar:

Yani, şöyle bozulmamış benim denetim iz bırakarak silme sonra, dostça dosyayı e-posta göndererek, bir dostça adıyla, geçici bir dizine Oluşturulan dosyayı kopyalama çalıştı System.IO.IOException numaralı hat System.IO.File.Delete(friendlyFilePath) numaralı hatta dosya e-postayla gönderildikten sonra kullanımda olduğundan.

Kopyalama ve silme işleminin iyi yapılmasını sağlayan e-posta kodunu aldım, bu nedenle de sorunun nedeni olan dosyayı e-postaya bağlaması.

Ayrıca, silme satırından önce beş dakika bekledikten, e-postanın gönderildiğini doğruladıktan sonra kodun ilerlemesinden önce breakpointing denedim, ancak kod ilerledikçe aynı istisna hala atıldı.

Bu sorunun nasıl çözüleceğini öneren herkes olabilir mi?

+0

Bu kadar büyük miktarda kod bölgesinde, kapatılmadığınız bir çeşit akışınız var mı? –

cevap

7

SmtpClient, tutamacı bir eke bırakmaz. Bunu elle işlemek zorunda kalacaksınız, ya da ne yaptığımı dosya içeriğini önce bir MemoryStream'e kopyalamanız gerekiyor. Aşağıdaki kod da çalışmalıdır.

using (MailMessage message = new MailMessage(from, to, subject, body)) 
using (Attachment attachment = new Attachment(fileName)) 
{ 
    message.Attachments.Add(attachment); 
    mailClient.UseDefaultCredentials = true; 
    mailClient.Send(message); 
} 
+0

Yup. Gönderildikten sonra tüm posta iletisinin eklerinin el ile imha edilmesi. Sorunu çözdüm. Teşekkürler. – Frosty840

3

Dosyalar'a erişirken Kullanım bildirimini kullanmalısınız. Bu nesnenin elden ve size System.IO.File.Delete aramak gerekir()

buraya bakın: http://msdn.microsoft.com/en-us/library/htd05whh(v=vs.80).aspx

+0

Bu daha iyi bir sonuçtur ... (hangisi olursa olsun) 'kullanma' olarak kullanmadığınız sürece (o zaman @ Nasir'in çözümünü kullanın) –

0

oluşturduktan sonra size ek dosyayı kapatın mü?

System.IO.FileStream afile = System.IO.File.Create(@"c:\test\astream.csv"); 
afile.Close(); 
afile = null; 

Benzer bir sorunun yanıtlandığı this forum'a bakın. (Bu asp.net ile C#, ama vb.net dönüştürüldüğünde bu hile yapmak gerekir)

+0

Silinmekte olan dosya 'System.IO.File.Copy' kullanılarak oluşturulur. soru geçerli değil. – Frosty840

11

mailClient.Send(message); sonra geçen yazıyı fark ederken bu eki kaynaklarını

1

yayınlayacak message.Attachments.Dispose();

eklemek Bu makalede birkaç yıl önce habersiz herkes için az miktarda ek bilgi eklemeye değer olduğunu düşündüm ...

E-postanızı eşzamansız olarak gönderiyorsanız, o zaman "kullanma" ya da herhangi bir şeyi kullanamazsınız. geri arama tetiklenene kadar MailMessage örneğinizi bir SendAsync() 'ın UserState parametresidir. Bu şekilde geri arama işlemi başladığında, ekleri ve MailMessage örneğini atabilirsiniz. Posta İstemcisini gönderen nesne olarak da atabilirsiniz.

İlgili konular