سؤال

لدي وظيفة إرسال رسائل (الكثير منها) ومرفقاتها.

إنها حلقات أساسا من خلال هيكل الدليل وإنشاء رسائل بريد إلكتروني من هيكل ملف على سبيل المثال

 c:\emails\message01
                \attachments
 c:\emails\message02
                \attachments

إنشاء الرسائل يحدث باستخدام .NET C #، الاشياء القياسية.

بعد إنشاء جميع الرسائل ... لدي وظيفة أخرى تعمل مباشرة بعد ذلك والتي تنسخ مجلد الرسائل إلى موقع آخر.

المشكلة هي - الملفات مغلقة ...

ملاحظة: أنا لا نقل الملفات، فقط نسخها ....

أي اقتراحات حول كيفية نسخ الملفات المقفلة، باستخدام C #؟

تحديث

لدي هذا إضافة طريقة المرفقات

    private void AddAttachments(MailMessage mail)
    {
        string attachmentDirectoryPath = "c:\messages\message1";
        DirectoryInfo attachmentDirectory = new DirectoryInfo(attachmentDirectoryPath);
        FileInfo[] attachments = attachmentDirectory.GetFiles();
        foreach (FileInfo attachment in attachments)
        {
            mail.Attachments.Add(new Attachment(attachment.FullName));
        }
    }
هل كانت مفيدة؟

المحلول

كيف تقرأ الملفات لإنشاء رسالة البريد الإلكتروني؟ يجب فتحها كما للقراءة فقط، مع FileShare ضبط ل FileShare.ReadWrite... ثم لا ينبغي أن تكون مؤمنة. إذا كنت تستخدم FileStream يجب عليك أيضا لف منطقك في using الكلمة الرئيسية حتى يتم التخلص من المورد بشكل صحيح.

تحديث:

أعتقد التخلص من رسالة البريد نفسها ستغلق الموارد داخلها وفتح الملفات:

using (var mail = new MailMessage())
{
    AddAttachments(mail);
}
// File copy code should work here

نصائح أخرى

أكره الرد على رسالتي الخاصة، ولكن نعم بالنسبة للرجل المستمر التالي الذي لديه هذه المشكلة هنا هو الإصلاح:

بعد إرسال الرسالة

        // Send the mail
        client.Send(message);

        //Clean up attachments
        foreach (Attachment attachment in message.Attachments)
        {
            attachment.Dispose();
        }

قم بالتخلص من المرفقات ... مسح القفل، وسوف ترسل الرسائل مع المرفقات. لا يحذف التخلص من الملفات، فقط مسح المرفقات :)

هل تغلق الملفات بعد الانتهاء من قراءةها؟ إذا قمت بفتحها للقراءة، ولكن لا تغلقها عند الانتهاء، يجب أن تبقي قفل عليه حتى يتم إنهاء البرنامج وتغلق تلقائيا جميع الملفات.

    MailMessage email = new MailMessage();

    email.From = txtFrom.Text;
    email.To = txtToEmail.Text;
    email.Subject = txtMSubject.Text; 
    email.Body = txtBody.Text;

    SmtpClient mailClient = new SmtpClient();
    mailClient.Host = "smtp.emailAddress";
    mailClient.Port = 2525;
    mailClient.Send(email );
    email.Dispose();

    // After Disposing the email object you can call file delete

    if (filePath != "")
    {
      if (System.IO.File.Exists(filePath))
      {
        System.IO.File.Delete(filePath); 
      }
    }

أرى هذا كثيرا عند إرسال المرفقات. أنا عادة استخدام شيء مثل ما يلي:

في التعليمات البرمجية التي تتحرك الملفات إلى موقع مختلف، يمكنك استخدام النمط التالي:

داخل الحلقة للحلقات من خلال الملفات

bool FileOk = false;
while (!FileOk)
{
   try
   {
      // code to move the file
      FileOk = true;
   }
   catch(Exception)
   {
      // do nothing or write some code to pause the thread for a few seconds.
   }

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top