2012-07-04 18 views
5

Mam problemy podczas wysyłania wielu załączników w moim programie.Wiele załączników w języku C#

Nie miałem żadnych problemów, zanim spróbowałem dodać wiele załączników. Więc zmieniłem trochę kodu i przestało działać.

Utwórz załącznik: Nie dodano całego kodu, aby był bardziej widoczny.

Attachment attachment = getAttachment(bodyFile, "Formulier" + counter + ".doc"); 
attachments.Add(attachment); 
//attachment.Dispose(); 

if (attachments != null) 
{ 
    foreach (Attachment attachment in attachments) 
    { 
    email.Attachments.Add(attachment); 
    } 
}  

Get Załącznik

private Attachment getAttachment(string bodyFile, string title) 
{ 
    return createDocument(bodyFile, title); 
} 

tworzenia pliku

private Attachment createDocument(string bodyFile, string title) 
{ 
    string activeDir = HttpContext.Current.Server.MapPath("/Tools"); 
    string newPath = Path.Combine(activeDir, "Documents"); 

    Directory.CreateDirectory(newPath); 
    newPath = Path.Combine(newPath, title); 

    FileStream fs = File.Create(newPath); 
    fs.Close(); 
    File.WriteAllText(newPath, bodyFile); 

    var fstemp = new FileStream(newPath, FileMode.Open, FileAccess.Read); 
    return new Attachment(fstemp, title, MediaTypeNames.Application.Octet); 

} 

błąd pojawia się w moim rejestratorze

2012-07-04 15:45:26,149 [19] ERROR Mvc - System.Net.Mail.SmtpException: Failure sending mail. ---> System.ObjectDisposedException: Cannot access a closed file. 
    at System.IO.__Error.FileNotOpen() 
    at System.IO.FileStream.Read(Byte[] array, Int32 offset, Int32 count) 
    at System.Net.Mime.MimePart.Send(BaseWriter writer) 
    at System.Net.Mime.MimeMultiPart.Send(BaseWriter writer) 
    at System.Net.Mail.Message.Send(BaseWriter writer, Boolean sendEnvelope) 
    at System.Net.Mail.SmtpClient.Send(MailMessage message) 
    --- End of inner exception stack trace --- 
    at System.Net.Mail.SmtpClient.Send(MailMessage message) 
    at ARTex.Tools.Mailer.Send(SmtpClient smtpClient, List`1 receivers, String subject, String body, List`1 attachments, String cc) in C:\Projects\KTN.Web.ARTex\ARTex\ARTex\Tools\Mailer.cs:line 262 

EDIT

Pozbyłem się metodą .Dispose i zmienił var fstemp = new FileStream(newPath ... Teraz mogę wysłać kilka załączników. Ale teraz losowo dają błąd lub nie. 4 na 5 razy działa. Po raz czwarty ponownie wyświetla błąd, ponieważ nie może otworzyć pliku. Piąty raz magicznie znów działa.

EDIT: Rozwiązanie

użyłem przy użyciu bloku w połączeniu z dwóch odpowiedzi. I to zadziałało. Tnx do @HatSoft i @Aghilas Yakoub

Odpowiedz

2

Spróbuj z tych linii (w swojej metodzie CreateDocument):

var fstemp = new FileStream(newPath, FileMode.Open, FileAccess.Read); 
return new Attachment(fstemp, title, MediaTypeNames.Application.Octet); 
+0

Teraz pojawia się ten błąd, gdy próbowałem, co powiedział System.Net.Mail.SmtpException: Niepowodzenie wysyłania poczty. ---> System.ObjectDisposedException: Nie można uzyskać dostępu do zamkniętego pliku. w System.IO .__ Błąd.FileNotOpen() – Sllix

+0

Myślę, że to rozwiązało problem. Ale czasami otrzymuję błąd losowy. Ale to działa, jak sądzę. Dziękuję Ci. – Sllix

+1

Mam nadzieję, że znajdę nowy problem bardzo szybko :) – Sllix

0

Wygląda jak nowa ścieżka w FileStream fs = File.Create (newPath); nie jest poprawny i żaden plik nie zostanie utworzony, patrząc na ciebie, że nowa ścieżka będzie kończyła się na "Dokumenty" i na nazwę pliku File.Create z rozszerzeniem, więc nie będzie to nic do dołączenia.

+0

Pliki zostaną utworzone. Pokaz w moim eksploratorze rozwiązań. – Sllix

+0

Czy możesz mi powiedzieć, co jest wewnątrz newPath przed wywołaniem FileMode.Open w FileStream proszę – HatSoft

+1

Wygląda na FileStream będzie również potrzebować FileAccess do odczytu, również proszę umieścić FileStream w bloku przy użyciu – HatSoft

2

Jaki jest numer linii 3 robi w kodzie?

attachment.Dispose(); 

Wygląda na to, że zanim dodasz go do Mail, wyrzucasz plik. Więc może być plik zamykany przed zakończeniem załącznika.

+0

Kiedy tego nie zrobię, pojawia się błąd, który mówi: nie mam dostępu do otwartego pliku .. – Sllix

+0

Dzięki temu była część problemu. – Sllix