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

时间:2013-10-16 13:04:46

标签: macos cocoa nsfilemanager macos-carbon

我有一些旧代码,使用旧的 FSFindFolder 例程查找特定文件夹。 现在我的任务是使代码现代化。 首先使用 NSFileManager URLForDirectory 似乎是正确的选择。 不幸的是,我发现 URLForDirectory 不再支持使用 FSFindFolder 找到的许多文件夹。

您可以使用 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 的情况下找到标记为“不可用”的每个文件夹的路径?

2 个答案:

答案 0 :(得分:3)

我建议在大多数情况下,现代化代码意味着首先要转移使用这些文件夹位置的任何内容。例如,在现代代码中,等效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:不推荐使用Component Manager; Apple says没有确切的替代品,但出于某些目的Audio Component Services是合适的。

答案 1 :(得分:1)

我将离开legacy documentation以获取FSFindFolder常量的定义。我会尽力做出有关他们如何绘制的有根据的猜测,所以如果我错了,请澄清,我会更新我的答案。

[NSFilemanager URLForDirectory:inDomain:appropriateForURL:create:error:]documentation)可以帮助您找到其中一些项目。它可以找到:

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处的文件夹。这也是一个静态的位置。

不确定kAudioComponentsFolderTypekVolumeRootFolderTypekSharedUserDataFolderTypeNo是否属实。