2013-09-17 3 views
0

У меня есть следующий код для просмотра папки для входящих файлов. Когда папка получает файлы, программа отправляет электронное письмо вместе с вложением файла, в данном случае, в формате pdf. Однако иногда мы получаем более одного файла и отправляет несколько писем с одним и тем же pdf, но с другим именем файла. Должен ли я выпустить файлы PDF? Я думал, что делаю это с помощью pdfFile.Dispose() и mail.Dispose().C# с помощью filewatcher для отслеживания папки для отправки электронной почты при получении pdf с вложением pdf

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Net.Mail; 

namespace Email 
{ 
class Program 
{ 
    static string files; 
    static void Main(string[] args) 
    { 
     fileWatcher(); 
    } 

    private static void fileWatcher() 
    { 
     try 
     { 
      //Create a filesystemwatcher to monitor the path for documents. 
      string path = @"\\server\folder\"; 
      FileSystemWatcher watcher = new FileSystemWatcher(path); 

      //Watch for changes in the Last Access, Last Write times, renaming of files and directories. 
      watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.FileName | NotifyFilters.LastWrite 
       | NotifyFilters.DirectoryName | NotifyFilters.CreationTime; 

      watcher.Filter = "FILE*"; 

      //Register a handler that gets called when a file is created. 
      watcher.Created += new FileSystemEventHandler(watcher_Created); 

      //Register a handler that gets called if the FileSystemWatcher need to report an error. 
      watcher.Error += new ErrorEventHandler(watcher_Error); 

      //Begin watching the path for budget documents/ 
      watcher.EnableRaisingEvents = true; 

      Console.WriteLine("Monitoring incoming files for Budget documents."); 
      Console.WriteLine("Please do not close."); 
      Console.WriteLine("Press Enter to quit the program."); 
      Console.ReadLine(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("{0} Exception caught", e); 
     } 
    } 


    //This method is called when a file is created. 
    static void watcher_Created(object sender, FileSystemEventArgs e) 
    { 

     try 
     { 
      //Show that a file has been created 
      WatcherChangeTypes changeTypes = e.ChangeType; 
      Console.WriteLine("File {0} {1}", e.FullPath, changeTypes.ToString()); 
      String fileName = e.Name.ToString(); 
      sendMail(fileName); 


      // throw new NotImplementedException(); 
     } 
     catch (Exception exc) 
     { 
      Console.WriteLine("{0} Exception caught", exc); 
     } 
    } 

    static void watcher_Error(object sender, ErrorEventArgs e) 
    { 
     Console.WriteLine("The file watcher has detected an error."); 
     throw new NotImplementedException(); 
    } 

    private static void sendMail(string fileName) 
    { 
     try 
     { 
      MailMessage mail = new MailMessage(); 
      mail.From = new MailAddress("[email protected]"); 
      mail.To.Add("[email protected]"); 

      string filesDirectory = @"\server\folder\"; 
      string searchForFile = "FILE*"; 
      string[] searchFiles = Directory.GetFiles(filesDirectory, searchForFile); 

      foreach (string File in searchFiles) 
       files = File; 
      Attachment pdfFile = new Attachment(files); 

      mail.Subject = "PDF Files " + fileName; 
      mail.Body = "Attached is the pdf file " + fileName + "."; 
      mail.Attachments.Add(pdfFile); 

      SmtpClient client = new SmtpClient("SMTP.MAIL.COM"); 

      client.Send(mail); 
      //To release files and enable accessing them after they are sent. 
      pdfFile.Dispose(); 
      mail.Dispose(); 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine("{0} Exception caught", e); 
     } 
    } 

} 

} 

Любая помощь была бы принята с благодарностью.

ответ

2

Ваш код предназначен для поиска последнего pdf-файла в каталоге и отправки его в качестве вложения с вновь созданным именем файла PDF в качестве имени файла в электронном письме.

Это связано с этим кодом здесь.

string[] searchFiles = Directory.GetFiles(filesDirectory, searchForFile); 

foreach (string File in searchFiles) 
     files = File; 
Attachment pdfFile = new Attachment(files); 

mail.Subject = "PDF Files " + fileName; 

Если вы посмотрите внимательно, вы заметите в цикле Еогеаспа это цикл всех файлы, которые соответствуют настройкам фильтра в каталоге, то установив переменные файлы в файл в цикле. По завершении цикла ваша файловая переменная будет последним файлом в каталоге.

Далее вы прикрепляете последний файл к письму и устанавливаете тему имени файла, переданного в качестве параметра.

Вам было бы лучше не искать файл, а затем добавлять файл в качестве вложения, например.

using (MailMessage mail = new MailMessage()) 
{ 
    mail.From = new MailAddress("[email protected]"); 
    mail.To.Add("[email protected]"); 

    //format our file paths 
    string filesDirectory = @"\server\folder\"; 
    string fileFullPath = Path.Combine(filesDirectory, fileName); 

    //file doesnt exist so exit the method 
    if (!File.Exists(fileFullPath)) 
     return; 

    using (var pdfFile = new Attachment(fileFullPath)) 
    { 
     mail.Subject = "PDF Files " + fileName; 
     mail.Body = "Attached is the pdf file " + fileName + "."; 
     mail.Attachments.Add(pdfFile); 

     SmtpClient client = new SmtpClient("SMTP.MAIL.COM"); 

     client.Send(mail); 
     //To release files and enable accessing them after they are sent. 
    } 
} 

В приведенном выше примере (да я перешел на использование заявления), но вы не заметите, я больше не искать весь каталог, но только проверить, если файл, который был создан еще существует. Вместо того, чтобы зацикливать все файлы, это приведет только к передаче только что созданного файла.

Сообщите мне, как это.

Cheers

+0

Ваши изменения работали точно так, как мне было нужно. Спасибо за помощь. Я очень ценю это. – acciocode