2016-12-01 5 views
2

FileSystemWatcher: как создавать события только для новых файлов в каталоге?FileSystemWatcher: как создавать события только для новых файлов в каталоге?

У меня есть каталог, который мой сервис сканирует. И я использую FileSystemWatcher:

конструктор:

if(Directory.Exists(_dirPath)) 
{ 
    _fileSystemWatcher = new FileSystemWatcher(_dirPath); 
} 

Затем я выписывает на каталог:

public void Subscribe() 
{ 
    try 
    { 
     //if (_fileSystemWatcher != null) 
     //{ 
     // _fileSystemWatcher.Created -= FileSystemWatcher_Created; 
     // _fileSystemWatcher.Dispose(); 
     //} 

     if (Directory.Exists(_dirPath)) 
     {      
      _fileSystemWatcher.EnableRaisingEvents = true; 
      _fileSystemWatcher.Created += FileSystemWatcher_Created; 
      _fileSystemWatcher.Filter = "*.txt";     
     }      
} 

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

Как получить информацию только по новым файлам? Спасибо!

+0

Ваш код работает для меня. Он уведомляет только о вновь созданных файлах. Это то, что должно делать событие «Создано». – user3185569

+0

Помогла ли вам решить вашу проблему? если да, не забудьте отметить это как ответ. –

ответ

4

Установив NotifyFilter на номер NotifyFilters.FileName | NotifyFilters.CreationTime | NotifyFilters.LastWrite, вы можете посмотреть, будут ли созданы новые файлы.

Вы также должны проверить e.ChangeType == WatcherChangeTypes.Created в поднятом случае после любых изменений.

static void Main(string[] args) 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher(); 
    string filePath = @"d:\watchDir"; 
    watcher.Path = filePath; 
    watcher.EnableRaisingEvents = true; 

    watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.CreationTime | NotifyFilters.LastWrite; 

    watcher.Filter = "*.*"; 
    watcher.IncludeSubdirectories = true; 
    watcher.Created += new FileSystemEventHandler(OnFileCreated); 

    new System.Threading.AutoResetEvent(false).WaitOne(); 
} 

private static void OnFileCreated(object sender, FileSystemEventArgs e) 
{ 
    if (e.ChangeType == WatcherChangeTypes.Created) 
     // some code    
} 
+1

Именование события 'OnCreated' как' OnChanged', в то время как событие 'Changed' в классе' FileSystemWatcher 'является немного запутанным! – user3185569

+0

'e.ChangeType' - это ключ. Хорошая вещь! – RBT

2

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

Некоторые приложения перезаписываются, другие присоединяются.

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

+0

OP хочет посмотреть создание новых файлов в каталоге. Добавление и перезапись связано с обновлением файлов. – RBT

+1

@RBT - Я заметил, что некоторые приложения, когда они исправляют файл, удаляют оригинал, а затем записывают тот же файл с новым контентом. Для ОС это выглядит как новый файл, который поднимет новое событие файла. –

+0

Ох. Это очень интересная находка. – RBT

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