Как определить, когда каталог или файл изменяется без постоянного сканирования - PullRequest
18 голосов
/ 09 июля 2010

Кроме чтения всех файлов и сравнения их с предыдущим снимком, есть ли способ обнаружить изменения каталога в C # в Windows?Я не возражаю против PInvoke, если это то, что нужно.

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

Ответы [ 2 ]

31 голосов
/ 09 июля 2010

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

Из документа:

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

Чтобы отслеживать изменения во всех файлах, задайте для свойства Filter пустую строку ("") или используйтеподстановочные знаки (". ").Чтобы просмотреть определенный файл, присвойте свойству Filter имя файла.Например, чтобы отслеживать изменения в файле MyDoc.txt, установите для свойства Filter значение «MyDoc.txt».Вы также можете следить за изменениями в файле определенного типа.Например, чтобы отслеживать изменения в текстовых файлах, задайте для свойства Filter значение «* .txt».

Существует несколько типов изменений, которые можно отслеживать в каталоге или файле.Например, вы можете отслеживать изменения атрибутов, даты и времени LastWrite или размера файлов или каталогов.Это можно сделать, установив для свойства NotifyFilter одно из значений NotifyFilters.Для получения дополнительной информации о типе изменений, которые вы можете наблюдать, см. NotifyFilters.

Вы можете следить за переименованием, удалением или созданием файлов или каталогов.Например, чтобы следить за переименованием текстовых файлов, установите для свойства Filter значение «* .txt» и вызовите метод WaitForChanged с параметром Renamed, указанным для его параметра.

5 голосов
/ 09 июля 2010

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

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

Это то, к чему вы, возможно, захотите быть осторожным, если вы 'мы будем делать что-нибудь с файлами.

...