1

我有在 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");
    }
}
4

3 回答 3

5

您无权访问 NSHomeDirectory(),

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

NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];
NSURL *homeURL = [NSURL fileURLWithPath:documentDirectory isDirectory:YES];
NSURL *previewsURL = [homeURL URLByAppendingPathComponent:@"Previews"];
于 2013-05-01T19:35:07.900 回答
2

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

然后,我看到您想要保存某种预览:它们是用户生成的图像,需要保存,还是它们只是为了加速某种过程而写入的某种缓存数据(下载的图像,更大版本图像的缓存预览..)?

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

NSString *cacheDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSURL *cacheURL = [NSURL fileURLWithPath:cacheDirectory isDirectory:YES];
NSURL *previewsURL = [cacheURL URLByAppendingPathComponent:@"Previews"];
于 2013-05-01T19:45:55.823 回答
0

很简单:因为您不能/不允许写入该目录(因为它位于应用程序沙箱之外)。

于 2013-05-01T19:34:07.333 回答