2013-05-01 2 views
0

У меня есть код, который создает папку под NSHomeDirectory, но он всегда терпит неудачу, и я не понимаю, почему. Он должен работать, но он продолжает говорить, что операция не разрешена. Есть идеи?Невозможно создать каталог под 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"); 
    } 
} 
+0

Вы пробовали создать свой каталог внутри, например, ~/Документы вместо этого? Вам не разрешается напрямую писать в домашнюю папку. – bdesham

ответ

3

У вас нет разрешения на доступ к NSHomeDirectory(),

Вместо этого создайте их в каталоге документов

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

Спасибо, я не знал, что это запрещено. – Brennan

0

Простые: потому что вы не можете/не разрешаете писать в этот каталог (поскольку он находится вне изолированной программной среды приложения).

1

Прежде всего, как было отмечено другими ответами, у вас нет разрешения на доступ домашний каталог.

Затем, я вижу, вы хотите сохранить какие-то предварительные просмотры: являются ли они изображениями, создаваемыми пользователем, что необходимо сохранить, или это просто какие-то кэшированные данные, написанные только для ускорения некоторых (загруженные изображения, кешированные превью более крупных версий изображений ..)?

Если это так, вы не должны использовать документ dir, так как его следует использовать для сохранения только содержимого, созданного пользователем, контента, которое ваше приложение не может воссоздать самостоятельно. Правильный каталог для таких целей - кеш-память. Если вы не следуете этому соглашению, ваше приложение может быть отклонено в процессе рассмотрения AppStore.

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

Да, я рассматриваю возможность использования папки Caches. Это для приложения iCloud, и до сих пор в примерах не используется папка Caches, которая, как мне кажется, нечетна для файлов предварительного просмотра. – Brennan

+0

Можно ли просматривать файлы предварительного просмотра по запросу из других версий файлов? Если ответ «да», они должны перейти в каталог Cache, в то время как оригинальные версии должны перейти в каталог документа, чтобы синхронизировать их в iCloud. Предварительный просмотр должен быть воссоздан вашим кодом, если они еще не сохранены в директории кеша. –