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

まず第一に、他の回答で指摘されているように、ホーム ディレクトリにアクセスする権限がありません。

次に、ある種のプレビューを保存したいことがわかりました。保存する必要があるユーザー生成の画像ですか、それとも、ある種のプロセス (ダウンロードされた画像、イメージのより大きなバージョンのキャッシュされたプレビュー..)?

この場合、ドキュメント dir は使用しないでください。ユーザーが生成したコンテンツのみを保存するために使用する必要があり、アプリ自体では再作成できないコンテンツを保存する必要があります。この種の目的に適したディレクトリは、キャッシュ ディレクトリです。この契約に従わない場合、アプリは 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 に答える