iPhone (iOS): ошибка копирования файлов из основного пакета в папку документов - PullRequest
8 голосов
/ 14 июля 2010

При первом запуске я пытаюсь скопировать некоторые файлы из пакета приложений в каталог документов.У меня есть проверки для первого запуска, но они не включены в фрагмент кода для ясности.Проблема в том, что я копирую в каталог документов (который уже существует) и в документации говорится, что:

dstPath не должно существовать до операции.

Как мне лучше всего выполнить копирование прямо в корневой каталог документов?Причина, по которой я хочу сделать это, заключается в том, чтобы разрешить поддержку общего доступа к файлам iTunes.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
  NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Populator"];

  NSLog(@"\nSource Path: %@\nDocuments Path: %@", sourcePath, documentsDirectory);

  NSError *error = nil;

  if([[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:documentsDirectory error:&error]){
    NSLog(@"Default file successfully copied over.");
  } else {
    NSLog(@"Error description-%@ \n", [error localizedDescription]);
    NSLog(@"Error reason-%@", [error localizedFailureReason]);
  }
  ...
  return YES;
}

Спасибо

Ответы [ 2 ]

11 голосов
/ 14 июля 2010

Ваш целевой путь должен содержать имя копируемого элемента, а не только папку с документами.Попробуйте:

if([[NSFileManager defaultManager] copyItemAtPath:sourcePath 
          toPath:[documentsDirectory stringByAppendingPathComponent:@"Populator"]
          error:&error]){
...

Редактировать: Извините, неправильно понял ваш вопрос.Не знаю, есть ли лучший вариант, чем перебирать содержимое папки и копировать каждый элемент отдельно.Если вы ориентируетесь на iOS4, вы можете использовать функцию NSArray -enumerateObjectsUsingBlock: для этого:

NSArray* resContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:copyItemAtPath:sourcePath error:NULL];
[resContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
    {
        NSError* error;
        if (![[NSFileManager defaultManager] 
                  copyItemAtPath:[sourcePath stringByAppendingPathComponent:obj] 
                  toPath:[documentsDirectory stringByAppendingPathComponent:obj]
                  error:&error])
            DLogFunction(@"%@", [error localizedDescription]);
    }];

PS. Если вы не можете использовать блоки, вы можете использовать быстрое перечисление:

6 голосов
/ 04 сентября 2011

примечание:
не выполняйте длительные операции в didFinishLaunchingWithOptions: это концептуальная ошибка. Если эта копия займет слишком много времени, сторожевой таймер убьет вас. запустить его во вторичном потоке или NSOperation ... Я лично использую таймерную процедуру.

...