Вопрос по c#, filesystemwatcher – Обнаружение перемещенных файлов с помощью FileSystemWatcher
=============================================================================================

Я понимаю, что FileSystemWatcher не предоставляет событие Move, вместо этого он генерирует отдельные события Delete и Create для одного и того же файла. (FilesystemWatcher следит за исходной и целевой папками).

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

Некоторое свойство класса FileSystemEventArgs, например "AssociatedDeleteFile» ему присваивается путь к удаленному файлу, если он является результатом перемещения, или NULL в противном случае, было бы здорово. Но, конечно, это нене существует.

Я также понимаю, что FileSystemWatcher работает на базовом уровне файловой системы, и поэтому концепция "Переехать" может иметь смысл только для приложений более высокого уровня. Но если это так, то какой алгоритм люди порекомендуют для решения этой ситуации в моем приложении?

Обновление на основе обратной связи:

Класс FileSystemWatcher, по-видимому, видит перемещение файла как просто два разных события: удаление исходного файла, за которым следует создание в новом месте.

К сожалению, нет "ссылка на сайт" между этими событиями, поэтому не очевидно, как отличить перемещение файла от обычного удаления или создания. На уровне ОС перемещение обрабатывается специально, вы можете перемещать, например, файл размером 1 ГБ практически мгновенно.

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

Как вы уже упоминали, не существует надежного способа сделать это с классом FileSystemWatcher по умолчанию, предоставляемым C #. Вы можете применить определенные эвристики, такие как имя файла, хэши или[уникальные идентификаторы файлов](https://stackoverflow.com/questions/1866454/unique-file-identifier-in-windows) сопоставить созданные и удаленные события вместе, но ни один из этих подходов не будет работать надежно. Кроме того, вы не можете легко получить хеш или идентификатор файла для файла, связанного с удаленным событием, а это означает, что вы должны сохранить эти значения в какой-либо базе данных.

Я думаю, что единственный надежный подход для обнаружения перемещений файлов - это создание собственного наблюдателя файловой системы. Поэтому вы можете использовать разные подходы. Если вы собираетесь наблюдать только изменения в файловых системах NTFS, одним из решений может быть чтение журнала изменений NTFS, как описано[Вот](https://technet.microsoft.com/en-us/library/bb742450.aspx), Какие'Приятно то, что он даже позволяет отслеживать изменения, произошедшие в то время, когда ваше приложение небегаю.

Другой подход заключается в создании драйвера минифильтра, который отслеживает операции файловой системы и направляет их в ваше приложение. Используя это, вы в основном получаете всю информацию о том, что происходит с вашими файлами, и выВы сможете получить информацию о перемещенных файлах. Недостаток этого подхода заключается в том, что вам необходимо создать отдельный драйвер, который необходимо установить в целевой системе. Однако хорошо то, что вы неНе нужно начинать с нуля, потому что я уже начал создавать что-то вроде этого:<https://github.com/CenterDevice/MiniFSWatcher>

Это позволяет вам просто отслеживать перемещенные файлы следующим образом:

Тем не менее, имейте в виду, что для этого требуется код ядра, который должен быть подписан для запуска в 64-битной версии Windows (если вы этого не сделаете[запрещать](https://msdn.microsoft.com/en-us/library/windows/hardware/ff553484(v=vs.85).aspx) проверка подписи для тестирования). На момент написания этот код также все еще находился на ранней стадии разработки, поэтому я бы хотелне использовать его в производственных системах еще. Но даже если тыЕсли вы не собираетесь его использовать, он все равно должен дать вам некоторую информацию о том, как события файловой системы могут отслеживаться в Windows.



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

Есть ли у вас случайные создания файлов, влияющие на обнаружение ходов?



Возможно, стоит попробовать события OnChanged и / или OnRenamed, упомянутые в[документация.](https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx)



Насколько я понимаю,`Renamed` событие для перемещения файлов ...?

Моя ошибка - в документах специально сказано, что рассматриваются только файлы внутри перемещенной папки "переименовал» в операции вырезания и вставки:

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

Это также говорит о перемещении файлов:

Обычные операции файловой системы могут вызывать более одного события. Например, когда файл перемещается из одного каталога в другой, могут возникнуть несколько событий OnChanged и некоторые события OnCreated и OnDeleted. Перемещение файла - это сложная операция, которая состоит из нескольких простых операций, поэтому вызывает несколько событий.



Согласно[документы:](https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx)

Обычные операции файловой системы могут вызывать более одного события. Например, когда файл перемещается из одного каталога в другой, могут возникнуть несколько событий OnChanged и некоторые события OnCreated и OnDeleted. Перемещение файла - это сложная операция, которая состоит из нескольких простых операций, поэтому вызывает несколько событий.

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