2012-10-04 32 views
6

Tôi đang tạo tệp trong ổ đĩa cục bộ có nội dung bằng cách sử dụng mã bên dưới.Quá trình không thể truy cập tệp, vì nó đang được sử dụng bởi một quy trình khác

File.WriteAllLines(path, contents); 

Tôi đính kèm tệp này vào thư và gửi ngang qua nhóm. Sau khi thư gửi tôi cần phải xóa các tập tin, để xóa các tập tin Tôi đang sử dụng mã dưới đây nhưng tôi nhận được lỗi runtime

File.Delete(path); 

Thông báo lỗi: Quá trình này không thể truy cập các tập tin, vì nó đang được sử dụng bởi một quy trình khác

theo mặc định Phương thức WriteAllLines() đóng tệp nhưng vẫn được mở bởi một quy trình khác. Tôi chỉ có thể xóa tệp bằng cách thực thi mã sau một thời gian nhưng đây không phải là kịch bản. Tôi cần xóa nó sau khi thư đã được gửi.

Cập nhật

System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage(); 

     mailMessage.To.Add(new System.Net.Mail.MailAddress(recipient, ToName)); 

     mailMessage.From = new System.Net.Mail.MailAddress(From, FromName); 
     mailMessage.Subject = Subject; // "Outlook calendar as attachment"; // modified by Srikanth J on 28/06/2012 
     mailMessage.Body = "This is a test message"; 

     System.Net.WebClient webclient = new System.Net.WebClient(); 

     webclient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 

     for (int i = 0; i < item.Attachments.Count; i++) 
     { 
      string url = item.Attachments.UrlPrefix + item.Attachments[i]; 
      SPFile file = item.ParentList.ParentWeb.GetFile(url); 
      mailMessage.Attachments.Add(new System.Net.Mail.Attachment(file.OpenBinaryStream(), file.Name)); 

     } 

     System.Net.Mail.Attachment mailAttachment = new System.Net.Mail.Attachment(path); 

     mailMessage.Attachments.Add(mailAttachment); 
     smtp.Send(mailMessage); 

Any help is appriciated, Cảm ơn bạn.

+1

Dường như quy trình đính kèm tệp vào thư vẫn giữ tệp? –

+0

Bạn có thể đăng mã nơi bạn đính kèm tệp không? Rất có thể vấn đề là @CuongLe được đề xuất. –

+0

@CuongLe Bạn có nghĩa là ngay cả sau khi gửi thư nó vẫn được giữ bởi quá trình gửi thư? – Srikanth

Trả lời

14

MailMessage thực hiện IDisposable, vì vậy bạn nên sử dụng các từ khóa using để phát hành bất kỳ tài nguyên khi bạn đang thực hiện với nó. Nếu bạn không làm điều đó, có, nó rất tốt có thể là các tập tin vẫn còn sử dụng cho đến khi thu gom rác xảy ra để thông báo rằng bạn không sử dụng tin nhắn nữa.

using (var mailMessage = new MailMessage()) 
{ 
    // set mailMessage properties 
    // ... 
    smtp.Send(mailMessage); 
} 

Bạn cũng có thể gọi Dispose cho tập tin đính kèm trực tiếp, nhưng xử lý một thông điệp đã được sẽ đảm bảo tất cả subobjects, trong đó có file đính kèm, được xử lý một cách chính xác.

0

EDIT

try 
{ 
    //send mail code 
} 
finally 
{ 
    mailAttachment=null; 
    mailMessage=null; 
} 
//delete file code 

Tôi đề nghị sau khi email sendind ở cuối cùng bạn relese các tập tin xử lý hoặc đóng file

try 
{ 
    //attach file 
    //send mail 
} 
finally 
{ 
    //set finally handle to null 
    // or close the file 
} 

//after this delete the file 
+2

'using' sẽ đẹp hơn. –

+0

@ L.B - có thets ý tưởng tốt để sử dụng nó ở đây tôi chỉ cần dán mã sudo cho điều này bởi vì doent op cung cấp bất kỳ mã –

1

Nếu bạn muốn làm điều này, tôi sẽ đề nghị bằng văn bản tập tin của bạn vào một tệp để Phát trực tuyến thay vì tệp.

Bằng cách đó, bạn có thể tránh hoàn toàn vấn đề về khóa tệp.

Dưới đây là ví dụ cho thấy cách thiết lập tệp đính kèm dựa trên luồng (mã để tự viết luồng không được hiển thị tại đây).

private static void SendReport(Report report) 
{ 
    MailMessage msg = new MailMessage 
    { 
     From = new MailAddress(Configuration.EmailFrom), 
     Subject = Configuration.EmailSubject, 
     Body = Configuration.EmailBody 
    }; 

    msg.To.Add(Configuration.EmailTo); 

    if (!string.IsNullOrWhiteSpace(Configuration.EmailCC)) 
     msg.CC.Add(Configuration.EmailCC); 

    if (!string.IsNullOrWhiteSpace(Configuration.EmailBcc)) 
     msg.Bcc.Add(Configuration.EmailBcc); 

    Program.AttachReport(report, msg); 

    SmtpClient smtp = new SmtpClient(); 
    smtp.Send(msg); 
} 

private static void AttachReport(Report report, MailMessage message) 
{ 
    Stream stream = new MemoryStream(); 
    report.Save(stream, Configuration.SurveyName); 
    message.Attachments.Add(new Attachment(stream, Configuration.AttachmentName, Configuration.AttachmentMediaType)); 
} 
2

Chỉ cần thêm một tuyên bố Sử dụng đơn giản để bạn

System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage(); 

thay đổi theo cách này

using(System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage()) 
{ 
     ....... 
     smtp.Send(mailMessage); 
} 

khi mã của bạn thoát khỏi báo cáo kết quả sử dụng các đối tượng MailMessage sẽ được xử lý cũng mọi đối tượng thực hiện giao diện IDisposable. Điều đó có nghĩa là mọi tệp đính kèm trong bộ sưu tập tệp đính kèm sẽ được xử lý và tệp của bạn không bị khóa nữa.

1

thử này

File.WriteAllLines(path, contents); 
using(System.Net.Mail.MailMessage mailMessage 
           = new System.Net.Mail.MailMessage()) 
{ 
// send mail containing the file here 
} 
File.Delete(path); 

Hope this helps u.

Các vấn đề liên quan