【问题标题】:Unable to create directory under NSHomeDirectory无法在 NSHomeDirectory 下创建目录
【发布时间】:2013-05-01 19:32:53
【问题描述】:

我有在 NSHomeDirectory 下创建文件夹的代码,但它总是失败,我不明白为什么。它应该可以工作,但它一直说不允许该操作。有什么想法吗?

NSURL *homeURL = [NSURL fileURLWithPath:NSHomeDirectory() isDirectory:YES];
NSURL *previewsURL = [homeURL URLByAppendingPathComponent:@"Previews"];

DebugLog(@"homeURL: %@", homeURL);
DebugLog(@"previewsURL: %@", previewsURL);

BOOL isDirectory = TRUE;
if (![[NSFileManager defaultManager] fileExistsAtPath:previewsURL.path isDirectory:&isDirectory]) {
    DebugLog(@"isDirectory: %@", isDirectory ? @"YES" : @"NO");
    NSAssert(isDirectory, @"Must be a directory");

    NSError *error = nil;
    if (![[NSFileManager defaultManager] createDirectoryAtPath:previewsURL.path withIntermediateDirectories:TRUE attributes:nil error:&error]) {
        DebugLog(@"Error: %@", error); // WHY?!
    }
    else {
        BOOL isDirectory = TRUE;
        BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:previewsURL.path isDirectory:&isDirectory];
        NSAssert(exists, @"Directory must exist");
    }
}

【问题讨论】:

  • 您是否尝试过在例如内部创建目录? ~/Documents 代替?可能不允许您直接写入主文件夹。

标签: ios objective-c nsfilemanager


【解决方案1】:

你无权访问 NSHomeDirectory(),

相反,在文档目录中创建它们

NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];
NSURL *homeURL = [NSURL fileURLWithPath:documentDirectory isDirectory:YES];
NSURL *previewsURL = [homeURL URLByAppendingPathComponent:@"Previews"];

【讨论】:

  • 谢谢,我不知道这是不允许的。
【解决方案2】:

首先,正如其他答案所指出的,您无权访问主目录。

然后,我看到您想要保存某种预览:它们是用户生成的图像,需要保存,或者它们只是某种缓存数据,只是写入加快某种进程(下载的图像、大版本图像的缓存预览..)?

如果是这种情况,您不应使用文档目录,因为它应该仅用于保存用户生成的内容,即您的应用无法自行重新创建的内容。用于这种目的的正确目录是缓存目录。如果您不遵守本协议,您的应用可能会被 AppStore 审核流程拒绝。

NSString *cacheDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSURL *cacheURL = [NSURL fileURLWithPath:cacheDirectory isDirectory:YES];
NSURL *previewsURL = [cacheURL URLByAppendingPathComponent:@"Previews"];

【讨论】:

  • 是的,我正在考虑使用 Caches 文件夹。这是一个 iCloud 应用程序,到目前为止,示例不使用 Caches 文件夹,我认为这对于预览文件很奇怪。
  • 可以根据需要从其他版本的文件中重新创建预览文件吗?如果答案是肯定的,他们应该去缓存目录,而原始版本应该去文档目录,以便在 iCloud 上同步它们。如果预览尚未存储在缓存目录中,则应由您的代码重新创建预览。
【解决方案3】:

简单:因为您不能/不被允许写入该目录(因为它在应用沙箱之外)。

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多