简体   繁体   English

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

[英]Copy Folder (w/contents) from bundle to Documents directory - iOS

EDIT: SOLVED 编辑:已解决

Thanks Brooks. 谢谢布鲁克斯。 Your question led me to keep digging into if the file even existed in my bundle - and it did not! 你的问题让我不断深入研究文件是否存在于我的包中 - 而事实并非如此!

So by using this code (also below): iPhone/iPad: Unable to copy folder from NSBundle to NSDocumentDirectory and the instructions for adding a directory properly to Xcode (from here and below)I was able to get it to work. 所以通过使用这个代码(也在下面):iPhone / iPad:无法将文件夹从NSBundle复制到NSDocumentDirectory以及向Xcode正确添加目录的说明(从这里和下面)我能够使它工作。

Copy folder into Xcode: 将文件夹复制到Xcode:

  1. Create a Directory on your Mac. 在Mac上创建目录。
  2. Select Add Existing Files to your project 选择“将现有文件添加到项目中”
  3. Select the Directory you want to import 选择要导入的目录
  4. In the pop-up window make sure you select "Copy items into destination group's folder" and "Create Folder References for any added folders" 在弹出窗口中,确保选择“将项目复制到目标组的文件夹”和“为任何添加的文件夹创建文件夹参考”
  5. Hit "Add" 点击“添加”
  6. The Directory should appear blue instead of yellow. 目录应显示为蓝色而不是黄色。

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

    } }

======================== END EDIT ========================结束编辑

Frus-stray-shee-on! FRU的杂散玉树-ON! Anyway... 无论如何...

The code below copies my folder from the app bundle to the Documents folder in the simulator just fine. 下面的代码将我的文件夹从应用程序包复制到模拟器中的Documents文件夹就好了。 However on the device I get an error and no folder. 但是在设备上我收到错误而没有文件夹。 Using ze Google I found out that the error (260) means the file (in this case my folder) does not exist. 使用ze谷歌我发现错误(260)意味着文件(在这种情况下我的文件夹)不存在。

What could be going wrong? 怎么可能出错? Why can I not copy my folder from the bundle to the Documents? 为什么我不能将文件夹从包中复制到文档? I have checked that the files exist - although the folder is not showing up - because Xcode wants flat file? 我已经检查过文件是否存在 - 虽然文件夹没有显示 - 因为Xcode想要平面文件? Did it turn my folder (dragged into Xcode) into a flat file of assets instead? 它是否将我的文件夹(拖入Xcode)转换为资产的平面文件?

I thank you for any assistance. 我感谢您的帮助。

//  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 ;
}

I've taken the liberty of editing some of the code I feel needs a little housekeeping. 我冒昧地编辑了一些我觉得需要一点管家的代码。 You're using deprecated methods, overly-complicated methods, and just plain ridiculous if-elses. 你正在使用弃用的方法,过于复杂的方法,只是简单荒谬的if-elses。 I would of course check that your file path is valid, having no idea what a .gallery file is, and making no attempt to provide a dummy one, the only judgement I can make is that your file path is simply invalid because the resource doesn't exist where you think it does. 我当然会检查你的文件路径是否有效,不知道.gallery文件是什么,并且没有尝试提供虚拟文件,我唯一可以判断的是你的文件路径是无效的,因为资源没有不管你认为它存在的地方。 (At one point, you ask to copy the file into the documents directory, then check if it exists in your bundle!) (有一次,您要求将文件复制到文档目录中,然后检查它是否存在于您的包中!)

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM