Как определить, когда файл был недавно переименован?
У меня есть программа, которая сравнивает файлы в двух папках. Я хочу определить, был ли файл переименован, определить самый новый файл (последний переименован) и обновить имя старого файла для соответствия.
Для этого я бы проверил, является ли новый файл побитовым идентичным старому, и если это так, просто переименуйте старый файл, чтобы он соответствовал новому.
Проблема в том, что мне нечего сказать, какой файл был недавно переименован.
Я хотел бы, чтобы некоторые свойства, такие как FileInfo.LastModified, но для файлов, которые были переименованы.
Я уже смотрел на такие решения, как FileSystemWatcher, и это не совсем то, что я ищу. Я хотел бы иметь возможность запускать мой синхронизатор в любое время, не беспокоясь о каком-то выделенном процессе, отслеживающем состояние папки.
Есть идеи?
5 ответов
A: По крайней мере, в NTFS вы можете прикрепить альтернативные потоки данных к файлу. При первой синхронизации вы можете просто прикрепить GUID в ADS к исходным файлам, чтобы пометить их.
B: Если у вас нет доступа для записи к источнику, сохраните хэши файлов, которые вы синхронизировали, в вашем целевом хранилище. Когда источник изменяется, вам нужно только хэшировать исходные файлы и сравнивать побитно только в случае коллизии хешей. В зависимости от качества и скорости вашей хеш-функции, это сэкономит вам много времени.
Если вы работаете на диске NTFS, вы можете включить журнал изменений, который вы можете затем запрашивать для переименования событий. Однако вы должны быть администратором, чтобы включить его, и он будет использовать дисковое пространство. К сожалению, я не знаю каких-либо конкретных реализаций C# для чтения журнала.
Я бы сделал CRC (например, пример CRC) из (всех?) Файлов в двух каталогах, в которых хранится время последнего обновления со значением CRC, именем файла и т. Д. После этого просматривайте списки, находя соответствия с помощью CRC, а затем используйте значения даты, чтобы решить, что делать.
Вы можете создать файл конфигурации, содержащий список всех ожидаемых имен в папке, а затем, если файл в папке не является членом ожидаемого списка имен, определить, что файл был переименован. Это, однако, добавит еще один уровень работы, учитывая, что вам придется менять список каждый раз, когда вы хотите добавить новый файл в папку.
Файловые системы обычно не отслеживают это.
Поскольку вы, кажется, находитесь в Windows, вы можете использовать GetFileInformationByHandle (). (Извините, я не знаю эквивалента C#.) Вы можете использовать поля "индекс файла" в возвращаемой структуре, чтобы увидеть, имеют ли файлы тот же индекс, что и тот, что вы видели раньше. Имейте в виду, что жесткие ссылки также будут иметь такой же индекс.
В качестве альтернативы вы можете как-то хэшировать содержимое файла.
Я не знаю точно, что вы пытаетесь сделать, поэтому я не могу сказать вам, имеет ли смысл какой-либо из этих пунктов. Возможно, самый разумный ответ: "Нет, ты не можешь этого сделать".