Событие FileSystemWatcher при добавлении папки с подкаталогами - PullRequest
4 голосов
/ 28 июля 2011

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

Проблема в том, что когда я копирую папку верхнего уровня (с одним или несколькими подкаталогами в ней), FileSystemWatcher ловит только добавление папки верхнего уровня, а не подкаталогов.

Пример: Перетащите папку 'foo' с подкаталогом 'bar' в просматриваемый каталог FileSystemWatcher уведомляет, что был создан новый каталог 'foo', но ничего не говорит о 'bar'

Я что-то упускаю из-за функциональности FileSystemWatcher или есть какой-то другой способ обойти это?

Ответы [ 5 ]

7 голосов
/ 28 июля 2011

Вам также необходимо обработать OnRenamed , а также IncludeSubdirectories .

С MSDN :

Копирование и перемещение папок

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

Чтобы получать уведомления о том, что содержимое папок было перемещено или скопировано в отслеживаемую папку, предоставьте обработчик событий OnChanged и OnRenamed методы ...

3 голосов
/ 28 июля 2011

Настройка IncludeSubdirectories не работает в этом конкретном случае.

Вот пример, который я настроил:

        static void Main(string[] args)
        {
            FileSystemWatcher fsw = new FileSystemWatcher(@"C:\Temp", "*.*");

            fsw.EnableRaisingEvents = true;

            fsw.Created += new FileSystemEventHandler(fsw_Created);
            fsw.Renamed += new RenamedEventHandler(fsw_Renamed);
            fsw.Changed += new FileSystemEventHandler(fsw_Changed);

            fsw.IncludeSubdirectories = true;

            Console.ReadLine();
        }

        static void fsw_Changed(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} was changed.", e.FullPath);
        }

        static void fsw_Renamed(object sender, RenamedEventArgs e)
        {
            Console.WriteLine("{0} was renamed.", e.FullPath);
        }

        static void fsw_Created(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} was created", e.FullPath);
        }

В этом случае, если я перемещу foo, который содержит папку bar в нем, вC: \ Temp, я получу уведомление только о созданном C: \ Temp \ Foo.

FileSystemWatcher не запечатан, если эта функциональность жизненно необходима, я бы создал ее подкласс и расширил бы ее для проверки в созданных папкахвызывать для них события (или что-то похожее на эту реализацию).

0 голосов
/ 28 июля 2011

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

IncludeSubdirectories сообщает вам только о модификациях файлов и папок в просматриваемом элементе, но, увы, нет, если он был скопирован за один ход. В вашем примере, когда вы смотрите foo и кто-то добавляет файл в bar (позже), и вы установили IncludeSubdirectories, вы будете уведомлены об этом изменении.

НТН

Mario

0 голосов
/ 28 июля 2011

Вам необходимо установить свойство IncludeSubdirectories.

Взгляните на эту ссылку

"Установите для IncludeSubdirectories значение true, если вы хотите отслеживать уведомления об измененияхдля файлов и каталогов, содержащихся в указанном каталоге "

watcher.IncludeSubdirectories = true;
0 голосов
/ 28 июля 2011

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

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