У меня есть приложение, которое ищет свои данные (* .txt) файлы в папке. У меня есть две папки, содержащие текстовые данные, которые мне нужно хранить отдельно, но было бы полезно, чтобы приложение рассматривало файлы текстовых данных как находящиеся в одной папке (содержащей два набора файлов).
Я могу создать скрипт, который поддерживает символические ссылки на файлы в двух папках в третьей объединенной папке.
Вместо того, чтобы изобретать велосипед, я хотел бы использовать проверенное решение, если это возможно.
Решение должно было бы иметь дело со случаем конфликта имен файла разумным способом.
text
filesystem
smart-folders
Стюарт Вудворд
источник
источник
Ответы:
Вы могли бы использовать
launchd
.launchd
позволяет управлять демонами и агентами в соответствии с определенными условиями.Что такое демоны и агенты?
От
man launchd
:От http://developer.apple.com/library/mac/#technotes/tn2083/_index.html :
Демон / агент описан в XML-файле с расширением plist. Одним из условий, которые можно отслеживать, являются изменения в папке . Это пригодится.
Хорошо, давайте запачкаем руки:
Допустим, это две папки, где вы и ваш друг храните ваши файлы:
и это общая папка для приложения:
Мы хотим отслеживать два пути выше и синхронизировать их содержимое с
/tmp/folder
.Это тот список, который делает то, что нам нужно:
Plist контролирует две папки с ключом
WatchPaths
(см. Http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html#//apple_ref/doc/uid/10000172i-SW7 -SW8 ).Предлагаю программу
rsync
для синхронизации папок. Опция--delete
гарантирует, что файлы, удаленные в контролируемых папках, также будут удалены в/tmp/folder
. Другие опции-aE
для копирования стандартные и расширенные атрибуты HFS +, и--exclude='.*'
пропустить.localized
,.DS_Store
и другие скрытые файлы.Я добавил
ThrottleInterval
на тот случай, если вы хотите установить минимальный интервал, когда может быть запущена работа. Значение по умолчанию - 10 с, то есть задания будут создаваться не чаще, чем раз в 10 секунд.Сохраните список (см.
man launchd
Список возможных путей) как:Создайте:
и загрузить (то есть включить) список:
Теперь создайте файл в
/tmp/folderstuart
:и смотреть, как происходит волшебство:
file.txt
будет создано в течение нескольких секунд/tmp/folder
. Удалите его, и он исчезнет из/tmp/folder
. Он также будет синхронизировать файлы, созданные или удаленные в/tmp/folderstuartsfriend
.Обратите внимание, что это решение не обрабатывает конфликты имен! Если вы не можете гарантировать, что файлы будут иметь разные имена, замените rsync на скрипт, который rsyncs и выполняет проверку имени файла, чтобы избежать потери данных.
Если копирование файлов не является вариантом, замените
rsync
его сценарием, который создает жесткие ссылки (если оба файла находятся в одной файловой системе, я бы рекомендовал жесткие ссылки вместо символических ссылок). Прежде чем менять лист, выгрузите его:Когда вы закончите, загрузите его снова.
источник
/tmp/folder
должна рассматриваться как доступная только для чтения, поскольку внесенные в нее изменения не будут распространяться обратно в другие папки. Кроме того, как заметил Жауме, конфликты имен приведут к перезаписи одного файла другим. С некоторой работой (редактирование файла XML вручную) вы можете создать смарт-папку, содержащую.txt
файлы из обеих папок. Будет ли это работать для вашего приложения?Почему бы не использовать ключевое слово или комментарий Spotlight, чтобы пометить файлы в каждой папке, а затем смарт-папку, чтобы показать их вместе?
источник