Обнаружение и регистрация операций копирования/вставки/удаления/вырезания в проводнике

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

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

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

FileSystemWatcher привязывает события create file и delete file к событиям changed и renamed, которые на самом деле не могут помочь меня, чтобы определить, было ли это сделано пользователем или каким-то другим процессом. Кроме того, я не могу быть на 100% уверен, что случилось с файлом, был ли он скопирован или вырезан и т. д.

Мне также нужно отслеживать местоположения «от/до» и имя файла.

Есть ли какая-то альтернатива FileSystemWatcher, которая может различать эти действия?


person Roma-MT    schedule 23.02.2014    source источник
comment
Этот вопрос обсуждается на Meta.   -  person Bernhard Barker    schedule 27.02.2014


Ответы (1)


Я думаю, что FileSystemWatcher будет полезен в этом сценарии. Вы можете использовать событие Changed, которое возникает при изменении файла или каталога — например, при копировании/вставке.

См. документацию MSDN для этого события и самого класса. Обратите внимание, что есть и другие события, которые вы также можете использовать для действий удаления/вырезания.

События используют FileSystemEventArgs, который содержит свойства для FullPath и Name.

person Rob Aston    schedule 23.02.2014
comment
В образце MSDN они хотят, чтобы я указал каталог, где должен смотреть наблюдатель, как я могу сделать его глобальным? для каждого события в каждом каталоге? - person Roma-MT; 23.02.2014
comment
Если вы хотите, чтобы он был глобальным для всего диска, вы можете установить каталог C:\ или любой другой корневой каталог. Затем в созданном вами объекте FileSystemWatcher установите для свойства IncludeSubdirectories значение true, и это будет отслеживать все подкаталоги. - person Rob Aston; 23.02.2014
comment
Я действительно пытаюсь заставить его работать :), ну, я надеюсь, что событие onChange действительно сделает свою работу. спасибо - person Roma-MT; 23.02.2014
comment
Мониторинг всего диска C:\ (или жесткого диска операционной системы), скорее всего, вызовет довольно много событий из-за операций с файлами ОС. Так что это должно быть что-то рассмотреть. - person Rob Aston; 23.02.2014
comment
Наконец-то я это сделал :), и да, как я и думал, миллиарды событий в секунду выполняются операционной системой, а не пользователем :( но меня интересуют операции, выполняемые пользователем, могу ли я как-то это отфильтровать? - person Roma-MT; 23.02.2014
comment
также я не могу знать, было ли оно скопировано или вставлено, оно запускает созданное событие для этих вещей. В любом случае спасибо за ваш ответ, я ценю это. - person Roma-MT; 23.02.2014
comment
Возможно, вы могли бы объединить событие удаления с событием создания и управлять кешем изменяемых файлов. - person Rob Aston; 23.02.2014
comment
Бильярдные файлы в секунду меняются (по крайней мере, на моей машине). Управление кешем было бы плохим ресурсом :(. Может быть, есть способ узнать, были ли изменения внесены пользователем напрямую. - person Roma-MT; 23.02.2014
comment
Наблюдатель слишком низкоуровневый крючок :(. Очевидно, он перехватывает onZwCreate события и т.д. - person Roma-MT; 23.02.2014
comment
К сожалению, я не думаю, что вы можете фильтровать по пользователям. Вы можете просто отслеживать каталог, который не включает папки и файлы ОС. - person Rob Aston; 23.02.2014
comment
Да, это то, что я придумал, прежде чем задать вопрос и здесь :( ... кажется, что это дыра в NT. :( - person Roma-MT; 23.02.2014
comment
мммхмм ... когда я щелкаю правой кнопкой мыши по файлу -> запускается какое-то событие, затем, когда я нажимаю копирование, вставку или вырезание, должны запускаться другие события -> можно ли его перехватить? (в этом случае я могу легко управлять кеш, чтобы знать откуда куда ). - person Roma-MT; 23.02.2014
comment
Я думаю, что событие Deleted будет вызвано для каталога, из которого копируется файл, а затем событие Created будет вызвано для нового каталога, в который он копируется. - person Rob Aston; 23.02.2014
comment
Я подумал о событии выбранного файла, а затем провел некоторые сравнения между выбранным файлом и событиями удаления/создания. Но я не учел 1 вещь - › пользователь может выбрать 3k файлов одновременно :( - person Roma-MT; 23.02.2014
comment
Также событие удаления не будет срабатывать для файла каталога, скопированного из , только создать событие в каталоге, скопированном в , событие удаления будет вести себя таким образом, только если файл был вырезан. - person Roma-MT; 23.02.2014