C # монитор файлов / папок - PullRequest
3 голосов
/ 21 ноября 2010

Мне уже удалось увидеть изменения файлов и папок с помощью FileSystemWatcher.

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

Для события удаления я даже не могу использовать грязный обходной путь при тестировании File.Exists (путь) или Directory.Exists (путь), потому чтофайл / папка уже удаляются при вызове метода.

Возможно, у этого объекта есть информация, которая мне нужна, но я ее не нашел:

FileSystemEventArgs e

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

Ответы [ 4 ]

2 голосов
/ 21 ноября 2010

Предполагая, что он находится на томе NTFS, я думаю, вы могли бы сделать то, что вам нужно, взглянув на Изменить журналы . В частности, FSCTL_READ_USN_JOURNAL контрольный код и просмотр FileAttributes из USN_RECORD , чтобы увидеть, является ли это FILE_ATTRIBUTE_DIRECTORY.

Вы можете найти образец здесь (в C ++, но, возможно, можно перевести на C # или просто написать небольшой C ++ dll для вызова из вашего приложения): Ходить по буферу записей журнала изменений

1 голос
/ 21 ноября 2010

Я нашел решение, которое является чистым и всегда работает:

Стандартная настройка наблюдателя для файлов и папок. Это не имеет смысла в моих глазах, так как я не могу определить, какой тип был у измененного объекта.

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

// for file
fileSysWatchFile.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
// for folder
fileSysWatchDir.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.LastWrite;
1 голос
/ 21 ноября 2010

Вы можете проверить, имеет ли он атрибут Directory :

var attributes = File.GetAttributes(@"c:\somepath");
if ((attributes & FileAttributes.Directory) == FileAttributes.Directory)
{
    // it's a directory
}
else
{
    // it's a file
}

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

0 голосов
/ 21 ноября 2010

Невозможно получить тип удаленного элемента, если у вас не было списка сопоставлений пути-> типа, в котором вы можете найти последний тип удаленного элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...