将多个文件复制到 Documents 目录

Posted

技术标签:

【中文标题】将多个文件复制到 Documents 目录【英文标题】:Copy multiple files to Documents directory 【发布时间】:2011-11-08 03:43:07 【问题描述】:

我想在应用程序启动时将多个文件从我的 NSBundle 复制到 Documents 目录。

这是复制文件的代码:

- (NSString *) getPath 

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
  NSString *documentsDir = [paths objectAtIndex:0];
  return [documentsDir stringByAppendingString:@"Photo.png"];


- (void) copyFile 

  NSFileManager *fileManager = [NSFileManager defaultManager];
  NSError *error;
  NSString *Path = [self getPath];
  BOOL success = [fileManager fileExistsAtPath:Path];

  if(!success) 

    NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Photo.png"];
    success = [fileManager copyItemAtPath:defaultPath toPath:Path error:&error];

    if (!success)
        NSAssert1(0, @"Failed to create writable file with message '%@'.", [error localizedDescription]);
  

copyFile 方法将在 'applicationDidFinishLaunchingWithOptions' 方法中调用。但是这种方法只允许将一个文件复制到 Documents 目录。如果我想从我的 NSBundle 中复制 50 个文件,这是否意味着我必须指定 50 个路径?有没有更短的方法,例如只用几行代码获取 NSBundle 中的所有文件?

【问题讨论】:

【参考方案1】:

您可以复制资源文件夹中的所有文件,但我怀疑您是否真的想这样做,是吗?毕竟这些也是应用程序资源(如字符串文件或仅用于 UI 按钮的图形等)

因此,您可能希望在资源文件夹中有一个子目录(例如,名为 FilesToCopy),其中包含您要复制的所有文件(例如,Photo.png 位于 Contents/Resources/FilesToCopy/Photo.png

要获取目录的内容,只需使用

NSError * err;
NSArray * files;
NSString * srcPath;
NSString * dstPath;
NSFileManager * man;

srcPath = [self getSrcPath];
dstPath = [self getDstPath];
man = [[NSFileManager alloc] init];
files = [man contentsOfDirectoryAtPath:srcPath error:&err];

然后你可以一次复制一个文件:

for (NSString *aFile in files) 
    BOOL success;

    NSString * srcFile = [srcPath stringByAppendingPathComponent:aFile];
    NSString * dstFile = [dstPath stringByAppendingPathComponent:aFile];
    success = [man copyItemAtPath:srcFile toPath:dstFile error:&err];
    // Verify success

现在您只需要srcPathdstPath

- (NSString *)getSrcPath

     return [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"FilesToCopy"];


- (NSString *)getDstPath

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    return [paths objectAtIndex:0];

【讨论】:

这实际上是问题的正确答案。谢谢 Mecki。 要记住的重要一点是在将它们拖入项目时从对话框中选择“创建文件夹引用”。如果你只是创建一个组,代码将找不到文件夹,因为它是一个组,因此它不会枚举文件,也不会进行复制。【参考方案2】:

改变你的函数原型:

- (NSString *) getPathofFileName:(NSString*)name;
- (void) copyFileWithName:(NSString*)name;

【讨论】:

@Lloydworth 因为那时你可以调用copyFileWithName 50 次,每次给出另一个文件名,copyFileWithName 可以每次用不同的文件名调用getPathOfFileName 来获取当前路径文件复制。当然,这仍然意味着您需要所有这 50 个文件的列表。所以这并不是一个真正方便的解决方案。【参考方案3】:

是的,你一定可以做到的

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    NSMutableArray *filesArray = [NSMutableArray arrayWithObjects:@"0.epub",@"1.epub",@"2.epub",@"3.epub",@"4.epub",nil];//here put the name of files you want to copy
    [self copyFilesToDocuments:filesArray];

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackOpaque;
    self.window.rootViewController = (UIViewController*)self.viewController;
    [self.window makeKeyAndVisible];
    return YES;


- (void) copyFilesToDocuments : (NSMutableArray*)filesArr 
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,        NSUserDomainMask, YES) lastObject];

    for(int i = 0 ; i < [filesArr count] ; i++) 
        NSString *filePath = [docDir stringByAppendingPathComponent:[filesArr objectAtIndex:i]];
        NSFileManager *fm = [NSFileManager defaultManager];
        BOOL exist = [fm fileExistsAtPath:filePath];
        NSError *error = nil;

        if (!exist) 
            NSString *path = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:[filesArr objectAtIndex:i]];
            BOOL success = [fm copyItemAtPath:path toPath:filePath error:&error];
            if (!success) 
                NSAssert1(0,@"%@",[error localizedDescription]);
            
        
    

【讨论】:

以上是关于将多个文件复制到 Documents 目录的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件从谷歌计算引擎复制到本地目录

如何将 SQLite 文件从 Documents 目录保存回目标 C 中的主包?

将通配符文件名从主包复制到文档?

将文件夹移动到 Documents 目录

将文件从多个(指定)文件夹路径复制到另一个目录,同时保持文件结构

iOS - 将特定图像从捆绑资源路径复制到 Documents Dir