iPhone/iPad: невозможно скопировать папку из NSBundle в NSDocumentDirectory

Я пытаюсь скопировать папку в своем 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"  

To

stringByAppendingPathComponent:@"Test.png"

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


person Lloydworth    schedule 09.11.2011    source источник


Ответы (3)


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

Такой метод может помочь (предупреждение - мое офисное соединение не работает, и я не могу получить доступ к своему 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);
        }
    }
}

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

person Geekswordsman    schedule 09.11.2011
comment
Он говорит, что directoryContentsAtPath устарел. - person Lloydworth; 09.11.2011
comment
И это не работает. Я попытался получить изображение из NSDocumentDirectory и отобразить его в представлении изображения, но оно не работает. - person Lloydworth; 09.11.2011
comment
@Lloydworth - обновленный код для вас, и он правильно работает на iOS 5.0. Дайте мне знать, если у вас есть какие-либо вопросы или вам нужна помощь! - person Geekswordsman; 09.11.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» является физической папкой, а не группой.

person user523234    schedule 09.11.2011
comment
Я удалил свой предыдущий комментарий о том, что это не работает. Это работает отлично. Спасибо - person bandejapaisa; 11.04.2012

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

person Oscar Gomez    schedule 09.11.2011
comment
О нет... Что означает, что если у меня есть 50 файлов для копирования, мне нужно написать коды для копирования для 50 из них? :( - person Lloydworth; 09.11.2011
comment
Боюсь, что так. Похоже, это либо код компьютерного фехтовальщика, либо foreachloop массива имен файлов. - person CodaFi; 09.11.2011