2012-02-08 6 views
5

मैं फ़ाइलों कि के रूप में परिभाषित एक समारोह में उत्पन्न कर रहे हैं की एक संख्या है:SmtpClient द्वारा अनुलग्नक के रूप में भेजे जाने के बाद फ़ाइल को खुली प्रतीत होती है। मैं फ़ाइल को कैसे हटा सकता हूं?

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 

इन फ़ाइलों को तुरंत मुद्रित कर रहे हैं और फ़ाइलें स्वचालित रूप से एक निर्देशिका में सहेजे जाते हैं; फाइलें वास्तविक सॉफ्टवेयर उपयोगकर्ताओं द्वारा उपयोग के लिए नहीं हैं। मैं उन्हें ऑडिटिंग उद्देश्यों के लिए विशिष्ट रूप से पहचाने जाने के लिए फ़ाइलों को टाइमस्टैम्प करता हूं।

मैं अब एक आवश्यकता बाह्य कंपनी के लिए इनमें से कुछ फ़ाइलों को ईमेल करने के लिए भेजा गया है, और किसी को शिकायत की है कि मौजूदा फ़ाइल नाम उपयोगकर्ता के अनुकूल नहीं हैं।

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 

यह एक फेंकता है:

तो, मैं एक अस्थायी निर्देशिका के लिए उत्पन्न फ़ाइल कॉपी, एक दोस्ताना नाम के साथ, मित्रवत फ़ाइल ईमेल, तो इसे हटाने, मेरे लेखापरीक्षा निशान बरकरार छोड़ रहा है, इसलिए तरह की कोशिश की System.IO.IOException लाइन System.IO.File.Delete(friendlyFilePath) पर क्योंकि फ़ाइल अभी भी उपयोग में है, इसे ईमेल करने के बाद।

मैंने ईमेल कोड निकाला है, जो प्रतिलिपि बनाने और हटाने को ठीक कर देता है, इसलिए यह स्पष्ट रूप से उस ईमेल को फ़ाइल संलग्न कर रहा है जो समस्या का कारण बनता है।

मैं भी हटाने की लाइन से पहले breakpointing की कोशिश की है, पांच मिनट इंतजार कर, इस बात की पुष्टि ईमेल भेज दिया गया तो कोड को आगे बढ़ाने, लेकिन एक ही अपवाद अभी भी फेंक दिया है।

कोई भी इस मुद्दे को हल करने का सुझाव दे सकता है?

+0

कोई भी मौका है कि उसमें [कोड की विशाल मात्रा] क्षेत्र में आपके पास कुछ प्रकार की धारा है जिसे आपने बंद नहीं किया है? –

उत्तर

7

SmtpClient एक अनुलग्नक को हैंडल जारी नहीं करता है। आपको इसे मैन्युअल रूप से संभालना होगा, या, मैं जो करता हूं, वह फ़ाइल सामग्री को पहले मेमोरीस्ट्रीम में कॉपी करता है। नीचे दिया गया कोड भी काम करना चाहिए।

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

यूप। भेजे जाने के बाद सभी मेल संदेश के अनुलग्नकों का मैन्युअल रूप से निपटान किया गया। समस्या का हल किया। धन्यवाद। – Frosty840

3

फ़ाइलों तक पहुंचने पर आपको उपयोग कथन का उपयोग करना चाहिए। यह आपके वस्तु के निपटान होगा और आप अपने System.IO.File.Delete कॉल करने के लिए सक्षम होना चाहिए()

यहाँ देखें: http://msdn.microsoft.com/en-us/library/htd05whh(v=vs.80).aspx

+0

यह बेहतर परिणाम है ... जब तक कि आप [किसी भी कारण से] 'उपयोग' के रूप में उपयोग नहीं कर रहे हैं (फिर @ नासीर के समाधान का उपयोग करें) –

0

क्या आप अपने अनुलग्नक फ़ाइल बंद करने के बाद आप इसे बना लिया है?

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

this forum देखें जहां एक समान प्रश्न का उत्तर दिया गया है। (यह सी # asp.net के साथ में है, लेकिन यह जब vb.net में बदला चाल करना चाहिए)

+0

हटाई जा रही फ़ाइल 'System.IO.File.Copy' का उपयोग करके बनाई गई है, इसलिए आपका सवाल लागू नहीं होता है। – Frosty840

11

mailClient.Send(message); के बाद message.Attachments.Dispose();

जोड़ने जबकि मैं पिछले पोस्ट का एहसास इस लगाव संसाधनों

1

जारी करेंगे इस आलेख पर कुछ साल पहले मैंने सोचा था कि यह किसी भी व्यक्ति के लिए अतिरिक्त जानकारी को जोड़ने के लायक है ...

यदि आप अपना ईमेल असीमित रूप से भेज रहे हैं तो आप किसी भी चीज़ का "उपयोग" या निपटान का उपयोग नहीं कर सकते कॉलबैक आग तक, इसके बजाय आपको अपना मेल मैसेज इंस्टेंस भेजना चाहिए SendAsync() का UserState पैरामीटर है। इस तरह जब कॉलबैक आग लगती है तो आप किसी भी अनुलग्नक और मेलमेज़ेज उदाहरण का निपटान करने में सक्षम होंगे। आप मेल क्लाइंट का निपटान भी कर सकते हैं क्योंकि यह प्रेषक ऑब्जेक्ट होगा।

संबंधित मुद्दे