使用URLForDirectory而不是FSFindFolder来定位Mac OS X文件夹

7
我有一些旧代码,使用旧的FSFindFolder例程查找特定文件夹。现在我需要对这段代码进行现代化改造。起初,使用NSFileManagerURLForDirectory似乎是正确的选择。不幸的是,我发现许多可以使用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

请跟随此链接http://stackoverflow.com/questions/18683345/cycle-through-a-directory-and-get-paths-of-all-the-files-and-folders/18688333#18688333。 - Hussain Shabbir
@hussain-shabbir问题18683345是关于遍历文件夹中的文件 - 它与我的问题无关。我的问题是关于定位特定文件夹的。 - Periodic Maintenance
你能否再详细地解释一下你想要实现什么?我的意思是,你需要什么输出结果? - Hussain Shabbir
如果我没错的话,您想在不使用FSFindFolder的情况下定位路径,对吗? - Hussain Shabbir
我已经更新了您的解决方案,请告诉我这是否是您想要的那个? - Hussain Shabbir
2个回答

3
我建议现代化代码,大多数情况下,意味着要远离最初使用这些文件夹位置的方式。例如,在现代代码中,几乎没有一个等同于kSystemFolderType的合法用途。您应该检查每种情况,看看您使用它们的原因是什么,以解决旧实现所解决的高级问题。
如果您确实需要访问其中一些文件夹的路径,则最好查看FSFindFolder()给出的路径,找到最接近的NSSearchPathDirectory,然后编写代码从URLForDirectory:...获取它,并将差异附加为静态相对路径。
一些具体的建议:
kPreferencesFolderType:使用NSUserDefaults存储首选项;将非默认值存储在Application Support中。

kTrashFolderType: 使用 -[NSWorkspace recycleURLs:completionHandler:]-performFileOperation:source:destination:files:tag:NSWorkspaceRecycleOperation 参数; 只有在必要时,使用 -[NSFileManager URLForDirectory:...]NSTrashDirectory 参数。

kVolumeRootFolderType: 如果您正在使用特定卷引用而不是域,请使用 -[NSURL getResourceValue:forKey:error:] 和键 NSURLVolumeURLKey

kSharedUserDataFolderType: 使用 -URLForDirectory:...NSUserDirectory 参数,然后将 @"Shared" 作为路径组件添加。

kAudioComponentsFolderType: 组件管理器已经被弃用;苹果表示没有确切的替代方案,但对于某些目的,音频组件服务是适当的。


1
“Apple说…”对我来说已经不够好了。我需要标准文件夹位置保持一致。从以前的文件夹位置移开也意味着我的用户无法向后兼容。过去15年左右,我的用户一直将他们的首选项保存在~/Library/Preferences文件夹中。最近,苹果有了新的主张,即不直接访问首选项文件夹。另一方面,我担心FSFindFolder在未来的系统中将不受支持,因此想使用现代Cocoa代码。 - Periodic Maintenance

1
我将遵循旧版文档中关于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指定System Folder中的Preferences文件夹。我不确定这是什么意思,因为在/System/Library中没有"preferences"文件夹。但是,在/Library/Preferences下有一个文件夹。这也是一个静态位置。

不清楚kAudioComponentsFolderType、kVolumeRootFolderType和kSharedUserDataFolderTypeNo。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接