Поиск папок Mac OS X с помощью URLForDirectory вместо FFSFindFolder

У меня есть старый код, который находит определенные папки, используя старую процедуру FSFindFolder. Теперь у меня есть задача модернизировать этот код. Сначала использование URLForDirectory в NSFileManager кажется правильным выбором. К сожалению, я обнаружил, что многие папки, которые можно найти с помощью FSFindFolder, больше не поддерживаются URLForDirectory.

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

Вот неполный список констант FSFindFolder, которые мне нужно преобразовать, и их эквивалентов URLForDirectory:

FSFindFolder                    URLForDirectory
==============================  ===============
kDesktopFolderType              NSDesktopDirectory
kCachedDataFolderType           NSCachesDirectory
kApplicationSupportFolderType   NSApplicationSupportDirectory
kTemporaryFolderType            located by calling NSTemporaryDirectory()
kCurrentUserFolderType          located by calling NSHomeDirectory()
kSystemFolderType               Not Available
kPreferencesFolderType          Not Available
kTrashFolderType                Not Available
kAudioComponentsFolderType      Not Available
kVolumeRootFolderType           Not Available
kSharedUserDataFolderTypeNo     Not Available

Мой вопрос: существует ли стандартный способ найти пути к каждой из папок с пометкой «Недоступно» без использования FSFindFolder?


person Periodic Maintenance    schedule 16.10.2013    source источник
comment
Перейдите по этой ссылке stackoverflow.com/questions/18683345/   -  person Hussain Shabbir    schedule 16.10.2013
comment
@hussain-shabbir Вопрос 18683345 касается просмотра файлов в папке. К моему вопросу это не имеет никакого отношения. Мой вопрос о поиске конкретных папок.   -  person Periodic Maintenance    schedule 16.10.2013
comment
Не могли бы вы объяснить немного больше, чего вы хотите достичь. Я имею в виду, какой результат вам нужен??   -  person Hussain Shabbir    schedule 21.10.2013
comment
Если я не ошибаюсь, вы хотите найти путь, не используя эту FSFIndFolder, верно?   -  person Hussain Shabbir    schedule 21.10.2013
comment
Я обновил ваше решение, дайте мне знать, это то, что вы хотели??   -  person Hussain Shabbir    schedule 21.10.2013


Ответы (2)


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

Если вам действительно нужны пути к некоторым из этих папок, лучше всего посмотреть путь, который дает FSFindFolder(), найти, какой NSSearchPathDirectory вам ближе всего, а затем просто написать свой код, чтобы получить его из URLForDirectory:..., и добавить разницу в виде статического относительный путь.

Некоторые конкретные рекомендации:

kPreferencesFolderType: используйте NSUserDefaults для сохранения настроек; хранить значения, отличные от значений по умолчанию, в поддержке приложений

kTrashFolderType: используйте -[NSWorkspace recycleURLs:completionHandler:] или -performFileOperation:source:destination:files:tag: с NSWorkspaceRecycleOperation; только при необходимости используйте -[NSFileManager URLForDirectory:...] с NSTrashDirectory

kVolumeRootFolderType: если вы используете это с определенной ссылкой на том, а не с доменом, используйте -[NSURL getResourceValue:forKey:error:] с ключом NSURLVolumeURLKey

kSharedUserDataFolderType: -URLForDirectory:... с NSUserDirectory, а затем добавить @"Shared" в качестве компонента пути

kAudioComponentsFolderType: Менеджер компонентов устарел; Apple говорит точной замены нет, но для некоторых целей Службы аудиокомпонентов.

person Ken Thomases    schedule 19.10.2013
comment
Apple говорит... мне это уже не подходит. Мне нужно стандартное расположение папок, чтобы быть последовательным. Отказ от предыдущего расположения папки означает также отказ от обратной совместимости для моих пользователей. У меня есть пользователи, которые в течение последних 15 лет или около того сохраняли свои настройки в папке ~/Library/Preferences. В последнее время у Apple появилась новая мелодия, в которой папка «Настройки» недоступна напрямую. OTOH, я боюсь, что FSFindFolder не будет поддерживаться в будущих системах, поэтому я хочу использовать современный код Cocoa. - person Periodic Maintenance; 22.10.2013

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

[NSFilemanager URLForDirectory:inDomain:appropriateForURL:create:error:] (документация) может помочь вам найти некоторые из этих элементов. Он может найти:

NSApplicationDirectory
NSDemoApplicationDirectory
NSDeveloperApplicationDirectory
NSAdminApplicationDirectory
NSLibraryDirectory
NSDeveloperDirectory
NSUserDirectory
NSDocumentationDirectory
NSDocumentDirectory
NSCoreServiceDirectory
NSAutosavedInformationDirectory
NSDesktopDirectory
NSCachesDirectory
NSApplicationSupportDirectory
NSDownloadsDirectory
NSInputMethodsDirectory
NSMoviesDirectory
NSMusicDirectory
NSPicturesDirectory
NSPrinterDescriptionDirectory
NSSharedPublicDirectory
NSPreferencePanesDirectory
NSApplicationScriptsDirectory
NSItemReplacementDirectory
NSAllApplicationsDirectory
NSAllLibrariesDirectory
NSTrashDirectory

В пользовательском, локальном, сетевом и системном доменах.

Это должно позаботиться о kTrashFolderType.

Насколько я могу судить, kSystemFolderType всегда будет папкой System в корневом каталоге (например, /System), поэтому вам не нужно искать ее. kPreferencesFolderType указывает папку Preferences в системной папке. Я не уверен, что это значит, так как в /System/Library нет папки «Настройки», но есть папка в /Library/Preferences. Это тоже статичное место.

Не уверен насчет kAudioComponentsFolderType, kVolumeRootFolderType и kSharedUserDataFolderTypeNo навскидку.

person BergQuester    schedule 19.10.2013