Как определить, был ли файл переименован с использованием какао? - PullRequest
5 голосов
/ 03 мая 2009

Я создаю служебное приложение, которое синхронизирует файлы в двух системах для Mac OSX. Мне нужно определить, когда файл был переименован, но в остальном это тот же файл. Как мне это сделать в Какао?

Ответы [ 5 ]

3 голосов
/ 04 мая 2009

Там нет простого ответа; вам нужно определить лучшую стратегию для вашего приложения.

На простом уровне работает с номером файловой системы. Вы можете получить это используя NSFileSystemFileNumber. Вероятно, лучше для этой работы использовать FSRef. Это C API, но относительно простой и имеет метод для сравнения с FSRefs на равенство.

Но существует множество приложений, которые выполняют операцию сохранения путем замены файла на диске и изменения его номера. Это может расстроить ваш код. Поэтому подумайте об использовании псевдонимов. Это та же система, которую использует Finder для отслеживания цели файла псевдонима. Используйте либо Alias ​​Manager (C API), либо одну из оболочек Objective-C с открытым исходным кодом (например, NDAlias ​​или BDAlias). Псевдоним приложит все усилия, чтобы сохранить ссылку на файл как путем, так и номером файла.

1 голос
/ 07 марта 2012

Несколько дополнительных деталей, с которыми я столкнулся:

Если файл только переименован, то этот файл будет сохранять тот же индекс (NSFileSystemFileNumber).

Однако, если файл был изменен, Mac OS X обычно заменяет старый файл копией нового файла, поэтому номера индексов не будут одинаковыми.

Если вы отредактируете текстовый файл в TextEdit, а затем сохраните его, вы можете заметить, что файл исчезает, а затем снова появляется в Finder. Однако если вы отредактируете этот файл с помощью редактора командной строки (vi, pico, emacs и т. Д.), Он будет сохранен непосредственно в файл.

Я предполагаю, что приложения Какао сначала сохранят во временный файл, а затем заменит исходную версию файла, что объясняет, почему иноды отличаются.

0 голосов
/ 15 марта 2016

Все вышеперечисленное потерпит неудачу, если у вас есть источник и назначение на разных платформах / ОС. Лучший способ - получить список новых и отсутствующих файлов в исходном и целевом расположениях, а затем, если какие-либо два файла имеют одинаковый размер? если они имеют одинаковый размер, сравните их с контрольной суммой / CRC, и если они одинаковые, то один из них был переименован.

0 голосов
/ 16 марта 2012

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

0 голосов
/ 03 мая 2009

Вы можете посмотреть на номер индекса (NSFileSystemFileNumber в атрибутах, возвращаемых NSFileManager), который будет охватывать простые случаи переименования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...