以编程方式获取Application Support文件夹的路径

Jac*_*mes 56 cocoa objective-c ios swift

我正在尝试为用户的Application Support文件夹获取NSString.

我知道我能做到,NSString *path = @"~/Library/Application Support";但这似乎并不优雅.我已经玩过使用NSSearchPathForDirectoriesInDomains但它看起来很啰嗦并创建了几个不必要的对象(至少,我的实现).

有一个简单的方法吗?

zap*_*aph 70

这已经过时了,目前的最佳实践使用方法FileManager.default.urls(for:in:)与下面@ andyvn22的评论一样.

最好的做法是使用NSSearchPathForDirectoriesInDomainsNSApplicationSupportDirectory"长气",因为它可能.

例:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *applicationSupportDirectory = [paths firstObject];
NSLog(@"applicationSupportDirectory: '%@'", applicationSupportDirectory);
Run Code Online (Sandbox Code Playgroud)

NSLog输出:

applicationSupportDirectory: '/Volumes/User/me/Library/Application Support'
Run Code Online (Sandbox Code Playgroud)

  • 对于swift来说,这不是首选的方法.来自docs:`你应该考虑使用FileManager方法urls(for:in :)和url(for:in:properFor:create :).返回URL,这是首选格式 (4认同)
  • 这是过时的——现在首选的方法是使用`FileManager.default.urls(for:in:)`。总的来说,Apple 正朝着用 URL 替换所有字符串路径的方向发展。 (2认同)

Jua*_*ero 33

斯威夫特4:

print(NSHomeDirectory())
Run Code Online (Sandbox Code Playgroud)

要么

print(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)
Run Code Online (Sandbox Code Playgroud)

let yourString = String(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)
Run Code Online (Sandbox Code Playgroud)

  • `NSHomeDirectory()` 似乎并不指向应用程序支持目录,而是指向外部应用程序沙箱目录。https://developer.apple.com/documentation/foundation/1413045-nshomedirectory (2认同)

And*_*Ley 21

斯威夫特3:

FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first
Run Code Online (Sandbox Code Playgroud)


Iva*_*pan 7

只是为了确保人们会开始使用推荐的方式:

- (NSArray<NSURL *> * _Nonnull)URLsForDirectory:(NSSearchPathDirectory)directory
                                      inDomains:(NSSearchPathDomainMask)domainMask
Run Code Online (Sandbox Code Playgroud)

文档中的扩展示例:

- (NSURL*)applicationDataDirectory {
    NSFileManager* sharedFM = [NSFileManager defaultManager];
    NSArray* possibleURLs = [sharedFM URLsForDirectory:NSApplicationSupportDirectory
                                 inDomains:NSUserDomainMask];
    NSURL* appSupportDir = nil;
    NSURL* appDirectory = nil;

    if ([possibleURLs count] >= 1) {
        // Use the first directory (if multiple are returned)
        appSupportDir = [possibleURLs objectAtIndex:0];
    }

    // If a valid app support directory exists, add the
    // app's bundle ID to it to specify the final directory.
    if (appSupportDir) {
        NSString* appBundleID = [[NSBundle mainBundle] bundleIdentifier];
        appDirectory = [appSupportDir URLByAppendingPathComponent:appBundleID];
    }

    return appDirectory;
}
Run Code Online (Sandbox Code Playgroud)

证明链接:https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW3