将文件从App捆绑包移动到ios上的Document文件夹

时间:2014-11-17 20:02:40

标签: ios

我在iOS上的App包中有文件。如何将其移至Document文件夹? 这可以通过一些配置来完成,还是我需要为它制作自定义代码?

我的意思是自定义代码:

  • check是第一次运行app:
  • 如果是,请将文件移至Document文件夹。

2 个答案:

答案 0 :(得分:1)

请查看NSFileManager,以便您根据需要复制文件系统中的文件。如果复制的文件未标记为备份到iCloud,您应该知道Apple 会拒绝您的应用

我使用以下方法将sqlite数据库从bundle复制到文件夹;它应该适用于您的目的,只需稍加修改。

+ (void)copyBundleFileToStoresDirectory:(NSString *)filename
{
    NSError *error;
    NSURL *fileURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:filename ofType:nil]];
    NSURL *pathURL = [SVOFileSystemMethods documentsSubdirectory:@"Stores" skipBackup:YES];

    if (fileURL)
    {
        if([[NSFileManager defaultManager] copyItemAtURL:fileURL toURL:pathURL error:&error])
        {
            //           NSLog(@"File successfully copied");
        }
        else
        {
            [[[UIAlertView alloc]initWithTitle:NSLocalizedString(@"error", nil) message: NSLocalizedString(@"Failed to copy database from bundle.", nil)
                                      delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", nil)  otherButtonTitles:nil] show];
            NSLog(@"Error description-%@ \n", [error localizedDescription]);
            NSLog(@"Error reason-%@", [error localizedFailureReason]);
        }
    }
}


+ (NSURL *) documentsSubdirectory:(NSString *)subdirectoryName skipBackup:(BOOL) skipBackup
{
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
    NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:subdirectoryName];  //untested change here -- was literal @"/Stores"

    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
    {
        [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:YES attributes:nil error:&error]; //Create folder
        NSURL *finalURL = [NSURL fileURLWithPath:dataPath];
        if (skipBackup)
            [SVOFileSystemMethods addSkipBackupAttributeToItemAtURL:finalURL];      // flag to exclude from backups.
        return finalURL;
    }
    else
        return [NSURL fileURLWithPath:dataPath]; // already existed
}


//
//  flags URL to exclude from backup
//
+ (BOOL) addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    NSError *error = nil;
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                                  forKey: NSURLIsExcludedFromBackupKey error: &error];
    if(!success)
    {
        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
    }

    return success;
}

答案 1 :(得分:1)

根据我的理解,您无法将文件从应用程序包“移动”到应用程序目录,因为这需要从包中删除它们。假设您的代码设置正确,您将获得拒绝访问权限。

然而,你可以“复制”文件,因为它只是一个阅读。

在我的情况下,我有一大堆文件,我想移动到应用程序的库目录,但无法。此外,由于文件数量的原因,复制操作成本太高。

在这种情况下,我更改了app逻辑以首先检查“新鲜”信息(我将保存到Library文件夹),&如果不存在,则返回App包以查找该文件的旧/原始副本。