将文件夹(带/ contents)从bundle复制到Documents目录 - iOS

时间:2012-03-22 20:33:18

标签: iphone ios copy bundle nsfilemanager

编辑:已解决

谢谢布鲁克斯。你的问题让我不断深入研究文件是否存在于我的包中 - 而事实并非如此!

所以通过使用此代码(也在下面):iPhone / iPad:无法将文件夹从NSBundle复制到NSDocumentDirectory以及将目录正确添加到Xcode(来自here及以下)的说明我能够获得它起作用。

将文件夹复制到Xcode:

  1. 在Mac上创建目录。
  2. 选择“将现有文件添加到项目中”
  3. 选择要导入的目录
  4. 在弹出窗口中,确保选择“将项目复制到 目标组的文件夹“和”为任何创建文件夹引用 添加了文件夹“
  5. 点击“添加”
  6. 目录应显示为蓝色而不是黄色。

    -(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);
        }
    }
    

    }

  7. ======================== 结束编辑

    的FRU杂散玉树-上!总之...

    下面的代码将我的文件夹从应用程序包复制到模拟器中的Documents文件夹就好了。但是在设备上我收到错误而没有文件夹。使用ze Google我发现错误(260)表示文件(在这种情况下是我的文件夹)不存在。

    可能出现什么问题?为什么我不能将文件夹从包中复制到文档?我已经检查过文件是否存在 - 虽然文件夹没有显示 - 因为Xcode想要平面文件?它是否将我的文件夹(拖入Xcode)转换为资产的平面文件?

    我感谢您的帮助。

    //  Could not copy report at path /var/mobile/Applications/3C3D7CF6-B1F0-4561-8AD7-A367C103F4D7/cmsdemo.app/plans.gallery to path /var/mobile/Applications/3C3D7CF6-B1F0-4561-8AD7-A367C103F4D7/Documents/plans.gallery. error Error Domain=NSCocoaErrorDomain Code=260 "The operation couldn’t be completed. (Cocoa error 260.)" UserInfo=0x365090 {NSFilePath=/var/mobile/Applications/3C3D7CF6-B1F0-4561-8AD7-A367C103F4D7/cmsdemo.app/plans.gallery, NSUnderlyingError=0x365230 "The operation couldn’t be completed. No such file or directory"}
    
    NSString *resourceDBFolderPath;
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *documentDBFolderPath = [documentsDirectory stringByAppendingPathComponent:@"plans.gallery"];
    BOOL success = [fileManager fileExistsAtPath:documentDBFolderPath];
    
    if (success){
        NSLog(@"Success!");
        return;
    } else {
        resourceDBFolderPath = [[[NSBundle mainBundle] resourcePath]
                                          stringByAppendingPathComponent:@"plans.gallery"];
        [fileManager createDirectoryAtPath: documentDBFolderPath attributes:nil];
        //[fileManager createDirectoryAtURL:documentDBFolderPath withIntermediateDirectories:YES attributes:nil error:nil];
    
        [fileManager copyItemAtPath:resourceDBFolderPath toPath:documentDBFolderPath           
                              error:&error];
    }
    
        //check if destinationFolder exists
    if ([ fileManager fileExistsAtPath:documentDBFolderPath])
    {
        //removing destination, so source may be copied
        if (![fileManager removeItemAtPath:documentDBFolderPath error:&error])
        {
            NSLog(@"Could not remove old files. Error:%@",error);
            return;
        }
    }
    error = nil;
    //copying destination
    if ( !( [ fileManager copyItemAtPath:resourceDBFolderPath toPath:documentDBFolderPath error:&error ]) )
    {
        NSLog(@"Could not copy report at path %@ to path %@. error %@",resourceDBFolderPath, documentDBFolderPath, error);
        return ;
    }
    

1 个答案:

答案 0 :(得分:11)

我冒昧地编辑了一些我觉得需要一点管家的代码。你正在使用弃用的方法,过于复杂的方法,只是简单荒谬的if-elses。我当然会检查你的文件路径是否有效,不知道.gallery文件是什么,并且没有尝试提供虚拟文件,我唯一可以判断的是你的文件路径是无效的,因为资源没有不管你认为它存在的地方。 (有一次,您要求将文件复制到文档目录中,然后检查它是否存在于您的包中!)

    -(void)testMethod {

    NSString *resourceDBFolderPath;

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

    if (success){
        NSLog(@"Success!");
        return;
    } 
    else {
        //simplified method with more common and helpful method 
        resourceDBFolderPath = [[NSBundle mainBundle] pathForResource:@"plans" ofType:@"gallery"];

        //fixed a deprecated method
        [fileManager createDirectoryAtPath:documentDBFolderPath withIntermediateDirectories:NO attributes:nil error:nil];

        [fileManager copyItemAtPath:resourceDBFolderPath toPath:documentDBFolderPath           
                              error:&error];

        //check if destinationFolder exists
        if ([ fileManager fileExistsAtPath:documentDBFolderPath])
        {
            //FIXED, another method that doesn't return a boolean.  check for error instead
            if (error)
            {
                //NSLog first error from copyitemAtPath
                NSLog(@"Could not remove old files. Error:%@", [error localizedDescription]);

                //remove file path and NSLog error if it exists.
                [fileManager removeItemAtPath:documentDBFolderPath error:&error];
                NSLog(@"Could not remove old files. Error:%@", [error localizedDescription]);
                return;
            }
        }
    }
}