iPhone / iPad: невозможно скопировать папку из NSBundle в NSDocumentDirectory - PullRequest
3 голосов
/ 09 ноября 2011

Я пытаюсь скопировать папку в моем NSBundle, которая содержит довольно много изображений.
Я пытался сделать это с этими кодами.

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *documentDBFolderPath = [documentsDirectory stringByAppendingPathComponent:@"Images"];

    NSString *resourceDBFolderPath = [[[NSBundle mainBundle] resourcePath]
                                          stringByAppendingPathComponent:@"Images"];
        [fileManager copyItemAtPath:resourceDBFolderPath toPath:documentDBFolderPath error:&error];

Допустим, в папке с именем Test.png есть изображение, и я хочу отобразить изображение на моей кнопке, оно не работает!
Однако, если я скопировал только одно изображение из NSBundle в NSDocumentDirectory, это работает!

Пример:

Изменение

stringByAppendingPathComponent:@"Images"  

К

stringByAppendingPathComponent:@"Test.png"

Таким образом, проблема заключается в копировании папки в NSDocumentDirectory!
Мои коды неверны?
Или невозможно скопировать папки? (Что означает, что я должен копировать файлы по отдельности)

Ответы [ 3 ]

6 голосов
/ 09 ноября 2011

Приведенный ниже код создаст папку «images» в каталоге документов и скопирует все файлы из папки «folderinbundle» в вашем комплекте в «images»

- (void) copyImages
{
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"folderinbundle"];  //folder contain images in your bundle
    NSString *destPath = [documentsDirectory stringByAppendingPathComponent:@"images"];  //images is your folder under document directory

    NSError *error;
    [[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:destPath error:&error];  //copy every files from sourcePath to destPath
}

Изменить, чтобы уточнить: вышесказанное будет работать, если "folderinbundle" - это физическая папка, а не группа.

5 голосов
/ 09 ноября 2011

Оскар правильный, в настоящее время нет способа скопировать всю папку с помощью одной команды.

Такой метод может помочь (предупреждаю - мое офисное соединение не работает, и я не могу получить доступ к своему Mac, чтобы убедиться, что этот код работает. Проверьте это, как только смогу) Просто позвоните с помощью [self copyDirectory: @ "Images"], и он обработает все остальное.

-(void) copyDirectory:(NSString *)directory {
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *documentDBFolderPath = [documentsDirectory stringByAppendingPathComponent:directory];
    NSString *resourceDBFolderPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:directory];

    if (![fileManager fileExistsAtPath:documentDBFolderPath]) {
        //Create Directory!
        [fileManager createDirectoryAtPath:documentDBFolderPath withIntermediateDirectories:NO attributes:nil error:&error];
    } else {
        NSLog(@"Directory exists! %@", documentDBFolderPath);
    }

    NSArray *fileList = [fileManager contentsOfDirectoryAtPath:resourceDBFolderPath error:&error];
    for (NSString *s in fileList) {
        NSString *newFilePath = [documentDBFolderPath stringByAppendingPathComponent:s];
        NSString *oldFilePath = [resourceDBFolderPath stringByAppendingPathComponent:s];
        if (![fileManager fileExistsAtPath:newFilePath]) {
            //File does not exist, copy it
            [fileManager copyItemAtPath:oldFilePath toPath:newFilePath error:&error];
        } else {
            NSLog(@"File exists: %@", newFilePath);
        }
    }
}

- РЕДАКТИРОВАТЬ 11/9/2011 - К сожалению об этом, так как я предупреждал, я не смог получить доступ к своему Mac для проверки кода. Обновил код, и я убедился, что он сейчас работает правильно. Добавлена ​​пара быстрых NSLogs, чтобы сообщить вам, существует ли новый каталог или новый файл.

0 голосов
/ 09 ноября 2011

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

...