2013-12-16 5 views
4

Я пытаюсь сохранить эскизы созданных пользователем фотографий в подкаталоге в каталоге документов, но я не могу создать этот подкаталог в первую очередь. При попытке создать подкаталог в каталоге документов я получаю эту ошибку (Нет такого файла или каталога):«Нет такого файла или каталога» Ошибка при создании каталога

Error Domain=NSCocoaErrorDomain Code=4 "The operation couldn’t be completed. (Cocoa error 4.)" 
UserInfo=0x17ef9c90 {NSFilePath=/var/mobile/Applications/FD0CC480-97FE-4E50-931F-5341DB6AD92B/Documents/com.Jonathan.App-Name/707F0431-7A09-4D33-B122-13C48AD4CA53, 
NSUnderlyingError=0x17e51520 "The operation couldn’t be completed. No such file or directory"} 

Я так запутался. Я знаю, что директория не существует, потому что я пытаюсь ее создать! Единственное, о чем я могу думать, это то, что каталог документов неверен, но это прямо из Apple Docs.

Я неправильно пытаюсь создать подкаталог?

- (NSURL *)documentsDirectory 
{ 
    NSFileManager *sharedFM = [NSFileManager defaultManager]; 

    NSArray *possibleURLs = [sharedFM URLsForDirectory:NSDocumentDirectory 
              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; 
} 

- (NSURL *)thumbnailDirectoryWithName:(NSString *)theName 
{ 
    NSURL *directory = [[self documentsDirectory] URLByAppendingPathComponent:theName]; 
    NSURL *thumbnailsDirectory = [directory URLByAppendingPathComponent:@"Thumbnails"]; 

    NSError *error; 

    if ([[NSFileManager defaultManager] fileExistsAtPath:[thumbnailsDirectory path]] == NO) 
    { 
     [[NSFileManager defaultManager] createDirectoryAtURL:thumbnailsDirectory withIntermediateDirectories:NO attributes:nil error:&error]; 

     if (error) 
     { 
      NSLog(@"[Thumbnail Directory] %@", [error description]); 

      return nil; 
     } 
    } 

    return thumbnailsDirectory; 
} 

Я также попытался createDirectoryAtPath: и stringByAppendingPathComponent: с безрезультатно.

В NSURL *directory в thumbnailDirectoryWithName: возвращается:

/var/mobile/Applications/FD0CC480-97FE-4E50-931F-5341DB6AD92B/Documents/com.Jonathan.App-Name/707F0431-7A09-4D33-B122-13C48AD4CA53 

Последний компонент пути к файлу, 707F0431-7A09-4D33-B122-13C48AD4CA53, это уникальный идентификатор для объекта в Core Data, которая позволяет мне уникально называют каталог.

Любая помощь очень ценится!

ответ

5

Вот способ получить каталог документов:

- (NSString *)documentsDirectory { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    return (paths.count)? paths[0] : nil; 
} 

Затем, чтобы построить путь к файлу:

- (NSURL *)thumbnailDirectoryWithName:(NSString *)theName { 

    NSString *namePath = [[self documentsDirectory] stringByAppendingPathComponent:theName]; 
    NSString *thumbnailsPath = [namePath stringByAppendingPathComponent:@"Thumbnails"]; 
    NSURL *thumbnailsURL = [NSURL fileURLWithPath:thumbnailsPath]; 

    NSError *error; 

    if ([[NSFileManager defaultManager] fileExistsAtPath:thumbnailsPath] == NO) { 
     [[NSFileManager defaultManager] createDirectoryAtURL:thumbnailsURL withIntermediateDirectories:NO attributes:nil error:&error]; 

     if (error) { 
      NSLog(@"[Thumbnail Directory] %@", [error description]); 
      return nil; 
     } 
    } 
    return thumbnailsURL; 
} 
11

Я принял @danh ответ, но я нашел причину для получения этой ошибки. Это была простая ошибка и еще одна причина, почему я не должен кодировать, когда устал, ха-ха. Я не могу найти причину, по которой Apple предлагает включить идентификатор пакета приложений в качестве имени подкаталога, но для исправления этой ошибки все, что мне нужно было сделать, было установлено withIntermediateDirectories:YES.

withIntermediateDirectories:

Если да, то этот метод создает любые несуществующие родительские каталоги части создания каталога в URL. Если НЕТ, этот метод терпит неудачу, если не существует промежуточных родительских каталогов.

В принципе, я пытался создать подкаталог в каталоге, которого не было.

+0

Спасибо, Это решило мою проблему. У меня уже был такой же код, как и danh, но он не работал. После смены его на «Да» это сработало. – Shruti

+0

@Shruti, проблем нет. Я рад, что это помогло кому-то другому. – Jonathan

Смежные вопросы