【问题标题】:Locating Mac OS X folders using URLForDirectory instead of FSFindFolder使用 URLForDirectory 而不是 FSFindFolder 定位 Mac OS X 文件夹
【发布时间】:2013-10-24 14:47:07
【问题描述】:

我有一些旧代码使用旧的 FSFindFolder 例程查找特定文件夹。 现在我的任务是对这段代码进行现代化改造。 起初使用 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

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

【问题讨论】:

  • @hussain-shabbir 问题 18683345 是关于浏览文件夹中的文件 - 这与我的问题无关。我的问题是关于定位特定文件夹。
  • 你能解释一下你想要达到的目标吗?我的意思是你需要什么输出??
  • 如果我没记错你想在不使用这个 FSFindFolder 的情况下定位路径吗??
  • 我已经更新了你的解决方案,让我知道这是你想要的吗??

标签: macos cocoa nsfilemanager macos-carbon


【解决方案1】:

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

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

一些具体建议:

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 says 没有确切的替代品,但对于某些用途,Audio Component Services 是合适的。

【讨论】:

  • “Apple 说...”对我来说已经不够好了。我需要标准文件夹位置保持一致。从以前的文件夹位置移开也意味着从我的用户的向后兼容性中移开。我有一些用户在过去 15 年左右的时间里一直将他们的偏好保存到 ~/Library/Preferences 的文件夹中。最近Apple有一个新曲子,其中Preferences文件夹不能直接访问。 OTOH 恐怕 FSFindFolder 在未来的系统中将不受支持,因此想使用现代 Cocoa 代码。
【解决方案2】:

对于FSFindFolder 常量的定义,我将不再使用legacy documentation。我会尽我所能对它们的映射方式做出有根据的猜测,所以如果我错了,请澄清,我会更新我的答案。

[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 指定系统文件夹中的首选项文件夹。我不确定这意味着什么,因为/System/Library 中没有“首选项”文件夹,但是/Library/Preferences 中有一个文件夹。这也是一个静态位置。

不确定kAudioComponentsFolderTypekVolumeRootFolderTypekSharedUserDataFolderTypeNo off-hand。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2012-08-16
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多