【问题标题】:Programmatically get path to Application Support folder以编程方式获取应用程序支持文件夹的路径
【发布时间】:2012-01-15 21:02:51
【问题描述】:

我正在尝试为用户的应用程序支持文件夹获取 NSString。

我知道我可以做到NSString *path = @"~/Library/Application Support";,但这似乎不太优雅。我已经尝试过使用NSSearchPathForDirectoriesInDomains,但它似乎很冗长,并创建了几个不必要的对象(至少,我的实现是这样)。

有没有简单的方法来做到这一点?

【问题讨论】:

  • 其实是~/Library/Application Support/...
  • 为什么这个标签是 iphone、ipad 和 ios?
  • @Eimantas:是的,更正了 OP。
  • @Yar:它没有标记任何这些东西
  • 感谢您解决这个问题,@Jack。

标签: ios objective-c swift cocoa


【解决方案1】:

这已经过时了,对于当前的最佳实践,请使用FileManager.default.urls(for:in:),如下面@andyvn22 的评论中所示。

最佳做法是使用 NSSearchPathForDirectoriesInDomainsNSApplicationSupportDirectory 尽可能“啰嗦”。

例子:

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

NSLog 输出:

applicationSupportDirectory: '/Volumes/User/me/Library/Application Support'

【讨论】:

  • 这看起来比我拥有的要干净得多。谢谢。
  • 对于 swift 这不是首选方法。来自文档:You should consider using the FileManager methods urls(for:in:) and url(for:in:appropriateFor:create:). which return URLs, which are the preferred format.
  • 如何在系统的 /Library/Application Support 中创建文件夹,而不是在用户 /Library/Application Support 中创建文件夹
  • 不,因为那会非常不安全。
  • 这已经过时了——现在首选的方法是使用FileManager.default.urls(for:in:)。一般来说,Apple 正朝着用 URL 替换所有字符串路径的方向发展。
【解决方案2】:

斯威夫特:

print(NSHomeDirectory())

print(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)

let yourString = String(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)

【讨论】:

  • NSHomeDirectory() 似乎没有指向应用程序支持目录,而是指向外部应用程序沙箱目录。 developer.apple.com/documentation/foundation/…
  • 非常感谢。答案主要是有效的 - 只是想说 URL 需要 .absoluteString - 否则你会收到错误:“无法使用类型为 '(URL?)' 的参数列表调用类型为 'String' 的初始化程序”
  • 请注意,我使用了.url(单数)形式,发现'Application Support'文件夹不存在,至少在Xcode模拟器中不存在。所以我设置了 create: true,它运行良好。
  • @MaksimKniazev 是的,这就是问题所在。
【解决方案3】:

斯威夫特 3:

FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first

【讨论】:

  • 这就是答案 - 很简单。
  • 如何强制它在 /Application Support 中创建 App 文件夹?使用您的命令创建 /Users//Library/Application Support/config.json 但我需要 /Users//Library/Application Support/AppName/config.json
【解决方案4】:

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

- (NSArray<NSURL *> * _Nonnull)URLsForDirectory:(NSSearchPathDirectory)directory
                                      inDomains:(NSSearchPathDomainMask)domainMask

文档中的扩展示例:

- (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;
}

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

【讨论】:

  • 大多数使用 CFBundleExecutable 名称作为最终目录,但建议使用捆绑 ID 可能是正确的,因为它更独特。但是,您必须权衡将来是否可能更改可执行文件或捆绑 ID,以便您可以保持对数据的访问。
【解决方案5】:

这对我有用:

NSError *error;
NSURL* appSupportDir = [[NSFileManager defaultManager]     
         URLForDirectory:NSApplicationSupportDirectory
                inDomain:NSUserDomainMask
       appropriateForURL:nil
                  create:YES
                   error:&error];

【讨论】:

  • 我尝试了上面所有人们谈论的方法,我总是得到“/var/root/Application Support”而不是当前用户,我的系统是10.15.7,有人有同样的问题吗?跨度>
【解决方案6】:

这是我用来获取数据库的。从斯坦福课堂上得到它。它可能对某人有所帮助。

NSURL *url = [[[NSFileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"database_name"];
NSLog(@"Database URL: %@",url);

【讨论】:

  • NSDocumentDirectory 返回 Documents 目录,而不是 Application Support 目录
  • 只需使用NSApplicationSupportDirectory 而不是NSDocumentDirectory
【解决方案7】:

创建单独的目标 C 类用于读取和写入文档目录。我会避免代码重写。以下是我的版本。

//Directory.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#define PATH (NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES))
#define BASEPATH (([PATH count] > 0)? [PATH objectAtIndex:0] : nil)

@interface DocumentsDirectory : NSObject

//Here you can also use URL path as return type and file path.
+(void)removeFilesfromDocumentsDirectory:(NSString*)filename;
+(NSString*)writeFiletoDocumentsDirectory:(NSString*)filename;
@end


#import "Directory.h"

@implementation DocumentsDirectory

UIAlertView *updateAlert;

+(void)removeFilesfromDocumentsDirectory:(NSString*)filename
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *filePath = [BASEPATH stringByAppendingPathComponent:filename];

    NSError *error;
    BOOL success = [fileManager removeItemAtPath:filePath error:&error]; //Remove or delete file from documents directory.

    if (success)
    {
        updateAlert= [[UIAlertView alloc] initWithTitle:@"Congratulations:" message:@"File is updated successfully" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [updateAlert show];
    }
    else
    {
        NSLog(@"Could not delete file -:%@ ",[error localizedDescription]);
        updateAlert= [[UIAlertView alloc] initWithTitle:@"Try again:" message:[error localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [updateAlert show];
    }
}

+(NSString*)writeFiletoDocumentsDirectory:(NSString*)filename
{
    NSString *foldDestination = BASEPATH;
    NSString *filePath = [foldDestination stringByAppendingPathComponent:filename];

    return filePath;
}

@end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2011-08-27
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多