Уникально идентифицировать файл в Windows

Мне нужно однозначно идентифицировать файл в Windows, чтобы у меня всегда была ссылка на этот файл, даже если он был перемещен или переименован. Я провел некоторое исследование и нашел вопрос Уникальный идентификатор файла в Windows способом, который использует метод GetFileInformationByHandle с C++, но, очевидно, это работает только для разделов NTFS, но не для разделов FAT.

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

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

Я буду использовать C#.

Спасибо,

2 ответа

Решение

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

Я хотел бы использовать метод GetFileInformationByHandle в NTFS и вернуться к хешированию на томах FAT.

В случае с Dropbox я думаю, что есть служба или процесс, работающий в фоновом режиме и наблюдающий за изменениями файловой системы. Это самый надежный способ, даже если он перестает работать, если вы остановите указанную службу / процесс.

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

Приложение автоматического резервного копирования является одним из примеров программы, которая должна проверять изменения состояния тома для выполнения своей задачи. Метод грубой силы для проверки изменений в каталогах или файлах заключается в сканировании всего тома. Однако часто это неприемлемый подход из-за снижения производительности системы. Другой метод заключается в том, чтобы приложение зарегистрировало уведомление каталога (путем вызова функций FindFirstChangeNotification или ReadDirectoryChangesW) для резервного копирования каталогов. Это более эффективно, чем первый метод, однако требует, чтобы приложение было запущено все время. Кроме того, если необходимо создать резервную копию большого количества каталогов и файлов, объем обработки и непроизводительные затраты памяти для такого приложения также могут привести к снижению производительности операционной системы.

Чтобы избежать этих недостатков, файловая система NTFS поддерживает журнал изменений порядкового номера обновления (USN). Когда в файл или каталог в томе вносятся какие-либо изменения, журнал изменений USN для этого тома обновляется описанием изменения и именем файла или каталога.

https://docs.microsoft.com/en-us/windows/win32/fileio/change-journals

Другие вопросы по тегам