2013-08-29 2 views
1

Я установил все свойства FSW в конструкторе (EnableRaisingEvents = true, filter = * .tif, IncludeSubdirectories = true, path = bla \ bla \ bla).FileSystemWatcher ведет себя непоследовательно

Приложение запускается на компьютере под управлением Windows Server 2008 R2 Standard и наблюдает за локальной папкой для созданных файлов. Вместо «C: \» я использую имя сети компьютеров «GRAHAM».

Проблема в том, что FSW не всегда срабатывает, когда файлы создаются/перемещаются в наблюдаемый каталог. Кажется, что иногда он делает, но чаще всего это не так.

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

Это очень затрудняет поиск ошибки/ошибки. У кого-нибудь есть идеи?

Это буквально все кода:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 

namespace Ekonomikompetens_unikt_namn 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e) 
     { 
      StringBuilder log = new StringBuilder(); 

      try 
      { 
       log.Append("--------------------").AppendLine().Append(DateTime.Now).AppendLine().Append("--------------------").AppendLine(); 

       FileInfo file = new FileInfo(e.FullPath); 

       while (IsFileLocked(file)) 
       { 
        System.Threading.Thread.Sleep(300); 
       } 
       string oFile = e.FullPath; 
       string nFile = oFile.Insert(oFile.Length - 4, "_" + DateTime.Now.ToString().Replace(" ", "").Replace("-", "").Replace(":", "")).Replace("\\XML Konvertering", "").Replace(@"\\GRAHAM\AnyDoc Invoices", @"\\FAKTURASERVER\AnyDoc"); 

       if (!Directory.Exists(nFile.Substring(0, nFile.LastIndexOf('\\')))) 
       { 
        Directory.CreateDirectory(nFile.Substring(0, nFile.LastIndexOf('\\'))); 
        File.Move(oFile, nFile); 
        Directory.Delete(oFile.Substring(0, oFile.LastIndexOf('\\'))); 
       } 
       else 
       { 
        File.Move(oFile, nFile); 
       } 

       log.Append("* Moved and stamped file: ").AppendLine().Append(oFile).Append(" to ").Append(nFile).AppendLine().Append("--------------------").AppendLine(); 

      } 
      catch (Exception x) 
      { 
       log.AppendLine().Append("*** ERROR *** ").Append(x).AppendLine().AppendLine(); 
      } 
      finally 
      { 
       TextWriter tw = new StreamWriter(@"C:\tidslog\log.txt", true, Encoding.Default); 
       //TextWriter tw = new StreamWriter(@"C:\PROJEKT\tidsstämplarn\log.txt", true, Encoding.Default); 
       tw.Write(log); 
       tw.Dispose(); 
      } 
     } 

     protected virtual bool IsFileLocked(FileInfo file) 
     { 
      FileStream stream = null; 
      try 
      { 
       stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
      } 
      catch (IOException) 
      { 
       return true; 
      } 
      finally 
      { 
       if (stream != null) 
        stream.Close(); 
      } 
      return false; 
     } 
    } 
} 

Примечание: Попробовать-всеобъемлющая, наконец, вероятно, не очень хорошо сделано, но я новичок в кодировании и не совсем уверен, как " catch ", регистратор никогда не регистрировал ошибку, хотя. Поскольку FSW никогда не срабатывает, нет никакой возможности для возникновения ошибки. Я догадываюсь.

+0

Некоторые комментарии, основанные на ответе @Anirudh: Поскольку ваш код обработчика событий занят, возможно, ваши файлы остаются незамеченными. То, что вы должны сделать, это asAnirudh suggestion, использовать пул потоков и далее, _fileWatcher.Created + = (sender, e) => YourOwnHandler (e.FullPath); –

+0

Для этих «смотреть папку для новых файлов, которые могут быть заблокированы и перемещать их куда-то еще», я всегда не использую «FileSystemWatcher» и вместо этого использую таймер для сканирования папки с регулярными интервалами (скажем один раз в секунду), собирать имена файлов, а затем пытаться их перемещать. Решение становится намного проще и надежнее, когда вы избегаете борьбы с особенностями «FileSystemWatcher». –

+0

@ ChristopherSirén: Прочтите мою серию исключений: http://blog.gauffin.org/2013/04/what-is-exceptions/. Возможно, это поможет вам лучше понять исключения. – jgauffin

ответ

3

Подписаться на Error события и проверить ошибку, если какой-либо


В случае, если есть большое количество создаваемого файла или изменен, это сделать

1> Увеличение InternalBufferSize.

Doc сказать:

Увеличение размера буфера может предотвратить отсутствие файловой системы события изменения. Однако увеличение размера буфера является дорогостоящим, потому что исходит из незагруженной памяти, которую нельзя поменять на диск, поэтому держать буфер как можно меньше. Чтобы избежать переполнения буфера, используйте свойства NotifyFilter и IncludeSubdirectories для фильтрации уведомлений о нежелательных изменениях.

2> Кроме того, вы делаете много вещей в fileSystemWatcher1_Created, который может вызвать буфер переполнится, заставляя его пропустить некоторые события ... Используйте ThreadPool вместо этого.

+0

Мне любопытно: пока «созданный» метод не завершился, вновь созданные файлы не будут обнаружены? Я, хотя они будут в очереди? – derape

+0

+1 для пункта 2, Было приятно обновить меня –

+0

хорошо, хорошо знать, я собираюсь исправить свою сейчас :-) – derape

Смежные вопросы