2016-03-09 3 views
0

У меня есть код (программа), работающий к настоящему времени, который использует выбор входных файлов, выходных папок и затем преобразование в xml.Когда/где реализовать FileSystemWatcher

Все переменные и методы находятся внутри класса (другой файл, но это не проблема).

В любом случае. Я хотел бы изменить его поведение на поведение hotfolder; Таким образом, когда какой-либо файл добавляется в папку, он будет обрабатываться на основе уже реализованных методов и делать все, что захочу.

Хорошо, теперь вот мой вопрос: на самом деле, на Form1.cs все, что я получил, это некоторые вызовы button_click. Должен ли я поместить метод FileSystemWatcher + OnChanged внутри Form1.Cs или разместить его внутри моего файла Classes.cs (это файл со всеми методами, переменными и т. Д. - бизнес-логикой). Кроме того, когда я его называю? Как только будет инициализирована форма1, было бы лучше? Спасибо за ваше мнение :)

+0

FileSystemWatcher - дорогостоящее действие, люди используют его, когда смена файла или папки на жестком диске очень чувствительна к текущему приложению, вы не должны использовать его, если это действительно не нужно. На основе ваших предыдущих вопросов вы разрабатываете инструмент, который преобразует тип файла в другой тип файла. Это не нужно для реализации этого techicque. – Sakura

+0

Меня попросили внедрить систему HotFolder - так что ... FileSystemWatcher - мой парень :) –

ответ

1

Наверняка, не кладите Наблюдателя в вашу форму.

Узор вы можете использовать что-то вроде этого:

public class DirectoryRefresher : IDisposable 
{ 
    private FileSystemWatcher FileWatcher { get; set; } 

    public DirectoryRefresher(string directorypath) 
    { 
     FileWatcher = SetupFileWatcher(directoryPath); 
    } 

    protected FileSystemWatcher SetupFileWatcher(string path) 
    { 
     var watcher = new FileSystemWatcher(path); 

     watcher.Changed += (sender, e) => { DoYourProcessing(e.FullPath); }; 
     watcher.Created += (sender, e) => { DoYourProcessing(e.FullPath); }; 
     watcher.Deleted += (sender, e) => { DoYourProcessing(e.FullPath); }; 

     watcher.EnableRaisingEvents = true; 

     return watcher; 
    } 

    public void DoYourProcessing(string filePath) 
    { 
     ... 
    } 

    public void Dispose() 
    { 
     try 
     { 
      if (FileWatcher != null) 
      { 
       FileWatcher.Dispose(); 
       FileWatcher = null; 
      } 
     } 
     catch 
     { 
      // ignored 
     } 
    } 

} 

Когда вы знаете папку, вы просто экземпляр DirectoryRefresher. Когда вы хотите остановить его, вы просто Dispose().

+0

Я попробую. Спасибо за подсказку :) –

+0

Я пытался выяснить, как это исправить, но я не могу: если я использую juse так, я не буду получать доступ к моим vars в родительском классе (они защищены). Если я создам новый экземпляр своего контента внутри этого класса, он получит новую копию без своих данных. –

+1

Мне сложно понять ваш полный сценарий, не видя кода. Если отдельный класс не подходит для вашего использования, вы можете прикрепить FileSystemWatcher к вашему «родительскому» классу, который, AFAICT, содержит всю вашу логику приложения. Просто сохраните свойство FileWatcher, метод установки и вставьте DoYourProcessing, повторно используя существующую логику. –