Как определить, когда файл был недавно переименован? - PullRequest
7 голосов
/ 23 февраля 2010

У меня есть программа, которая сравнивает файлы в двух папках. Я хочу определить, был ли файл переименован, определить самый новый файл (последний переименован) и обновить имя старого файла для соответствия.

Чтобы выполнить это, я бы проверил, является ли самый новый файл побитовым идентичным старому, и если это так, просто переименуйте старый файл, чтобы он соответствовал новому.

Проблема в том, что мне нечего нажимать, чтобы сказать, какой файл был недавно переименован.

Мне бы хотелось иметь какое-либо свойство, например FileInfo.LastModified, но для файлов, которые были переименованы.

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

Есть идеи?

Ответы [ 5 ]

1 голос
/ 23 февраля 2010

A: По крайней мере в NTFS вы можете прикрепить альтернативные потоки данных к файлу . При первой синхронизации вы можете просто прикрепить GUID в ADS к исходным файлам, чтобы пометить их.

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

1 голос
/ 23 февраля 2010

Если вы работаете на диске NTFS, вы можете включить журнал изменений , который затем можно будет запрашивать, например, о событиях переименования. Однако вы должны быть администратором, чтобы включить его, и он будет использовать дисковое пространство. К сожалению, я не знаю каких-либо конкретных реализаций C # для чтения журнала.

0 голосов
/ 23 февраля 2010

Я бы сделал CRC (например, Пример CRC ) из (всех?) Файлов в 2 каталогах, в которых хранится время последнего обновления со значением CRC, именем файла и т. Д. После этого просмотрите выводит список соответствий с помощью CRC, а затем использует значения даты, чтобы решить, что делать.

0 голосов
/ 23 февраля 2010

Файловые системы обычно не отслеживают это.

Поскольку вы, похоже, работаете в Windows, вы можете использовать GetFileInformationByHandle () . (Извините, я не знаю эквивалент C #.) Вы можете использовать поля «индекс файла» в возвращаемой структуре, чтобы увидеть, имеют ли файлы тот же индекс, что и тот, что вы видели раньше. Имейте в виду, что жесткие ссылки также будут иметь такой же индекс.

В качестве альтернативы вы можете как-то хэшировать содержимое файла.

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

0 голосов
/ 23 февраля 2010

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

...