7

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

我的问题:是否有一种标准方法可以在不使用FFSFindFolder的情况下找到每个标记为“不可用”的文件夹的路径?

4

2 回答 2

3

我建议,在大多数情况下,现代化代码意味着首先要从您使用这些文件夹位置的任何地方转移。例如,kSystemFolderType现代代码中的等价物并没有多少合法用途。您应该检查使用这些的每种情况,并询问正确的解决方案是解决旧实现正在解决的高级问题。

如果您确实需要其中一些文件夹的路径,最好的办法是查看FSFindFolder()给出的路径,找到NSSearchPathDirectory最接近您的路径,然后只需编写代码以从中获取该URLForDirectory:...路径并将差异附加为静态相对路径。

一些具体的建议:

kPreferencesFolderType:用于NSUserDefaults存储偏好;在应用程序支持中存储非默认值

kTrashFolderType:使用-[NSWorkspace recycleURLs:completionHandler:]or -performFileOperation:source:destination:files:tag:; NSWorkspaceRecycleOperation仅在必要时-[NSFileManager URLForDirectory:...]使用NSTrashDirectory

kVolumeRootFolderType:如果您将其与特定的卷引用而不是域一起使用,请-[NSURL getResourceValue:forKey:error:]与键一起使用NSURLVolumeURLKey

kSharedUserDataFolderType:-URLForDirectory:...使用NSUserDirectory然后附加@"Shared"为路径组件

kAudioComponentsFolderType:不推荐使用组件管理器;Apple表示没有确切的替代品,但出于某些目的,音频组件服务是合适的。

于 2013-10-19T11:06:08.677 回答
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/Library有一个文件夹位于/Library/Preferences. 这也是一个静态位置。

不确定kAudioComponentsFolderType,kVolumeRootFolderTypekSharedUserDataFolderTypeNo副手。

于 2013-10-19T04:26:33.987 回答