Iphone NSFileManager-在启动时复制文件

Iphone NSFileManager-在启动时复制文件,iphone,cocoa,document,nsfilemanager,copying,Iphone,Cocoa,Document,Nsfilemanager,Copying,我需要从我的应用程序的资源文件夹中复制一些示例文件,并将它们放在我的应用程序的文档文件夹中。我提出了附加的代码,它编译的很好,但它不工作。我提到的所有目录都存在。我不太清楚我做错了什么,有人能给我指出正确的方向吗 NSFileManager*manager = [NSFileManager defaultManager]; NSString*dirToCopyTo = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]

我需要从我的应用程序的资源文件夹中复制一些示例文件,并将它们放在我的应用程序的文档文件夹中。我提出了附加的代码,它编译的很好,但它不工作。我提到的所有目录都存在。我不太清楚我做错了什么,有人能给我指出正确的方向吗

NSFileManager*manager = [NSFileManager defaultManager];

NSString*dirToCopyTo = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

NSString*path = [[NSBundle mainBundle] resourcePath];

NSString*dirToCopyFrom = [path stringByAppendingPathComponent:@"Samples"];


NSError*error;

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyFrom error:nil];

for (NSString *file in files)
{
        [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:dirToCopyTo error:&error];

        if (error)
        {
            NSLog(@"%@",[error localizedDescription]);
    }
}
编辑:我只是按原样编辑了代码。然而,现在还有另一个问题:

2010-05-15 13:31:31.787书面形式 Mobile[4587:207]DAMutableDictionary.h 2010-05-15 13:31:31.795书面形式 移动[4587:207]文件管理器 错误:无法执行操作 完整的。文件存在

编辑:我已通过告诉NSFileManager复制文件的目的地名称修复了该问题

        [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:[dirToCopyTo stringByAppendingPathComponent:file] error:&error];

我认为问题出在这方面:

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyTo error:nil];
您正在目标目录而不是源目录中列出文件。将其更改为:

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyFrom error:nil];

你应该没事。

我想问题是你正在从dirToCopyTo读取要复制的文件,我想你是指dirToCopyFrom

还要获取您应该使用的文档目录

目标路径是您希望副本具有的路径,包括其文件名。您不能将路径传递给希望NSFileManager填写源文件名的目录;它不会这样做

表示目标路径不能描述任何存在的内容:

…操作之前,dstPath不得存在

在您的情况下,它是目标目录的路径,因此它确实存在,这就是复制失败的原因


您需要将所需的文件名附加到目标文件,使其成为目标文件的路径。然后它将不存在(如果以前没有复制),因此复制将成功。

请注意,启动时必须避免长时间的操作:

  • 不好的用户体验(延迟和裁剪行为)
  • iOS中的看门狗可以像卡住一样杀死你的应用程序
  • 因此,在辅助线程中执行复制(或操作…或使用不同执行路径的任何操作)

    如果您需要数据来填充UI,则会出现另一个问题:在这种情况下:

    • 禁用UI元素
    • 启动异步/线程操作
    • 在复制的完成回调中(通过通知、协议…或其他方式) 通知UI界面它可以开始提取数据
    例如,我们复制一个ZIP文件并解压缩它,但这需要一些时间,所以我们必须将它放入一个计时器过程中,当完成时将触发UI

    如果你需要一个例子,告诉我

    附言:
    使用ZIP文件复制效率更高,因为:

  • 仅调用文件系统
  • 要复制的字节要少得多
  • 坏消息是:你必须使用一个例行程序来解压zip文件,但是你可以在网上找到它们


    解压Zip文件应该更有效,因为这些调用是用纯C编写的,而不是用Cocoa编写的,会带来所有的开销

    谢谢!这确实是问题所在。现在我找到了另一个,这是我的日志输出:2010-05-15 13:31:31.787 WriteIt Mobile[4587:207]DAMutableDictionary.h 2010-05-15 13:31:31.795 WriteIt Mobile[4587:207]FileManager错误:操作无法完成。文件存在2010-05-15 13:31:31.795 WriteIt Mobile[4587:207]DAMutableDictionary.m 2010-05-15 13:31:31.802 WriteIt Mobile[4587:207]文件管理器错误:无法完成操作。文件存在等。。。等这到底是什么意思?好像你在试图覆盖一个文件。复制前-确保它不存在。但文档目录为空?这就是为什么我感到惊讶?即使重置了iPhone模拟器,它仍然显示相同的结果。这并不重要,因为两者都返回相同的结果;)在非英语版本的OSX中,目录是否总是文档?是的,marc,我的iPhone设置为德语,所有文档目录仍然称为“文档”。Mark:iPhone上不存在这种方法。iPhone应用程序中唯一的方法(除了从整个布料中伪造路径外)是
    NSSearchPathForDirectoriesInDomains
    函数:不抑制错误返回(
    contentsoDirectoryAtPath:error:
    )。另外,对于
    copyItemAtPath:toPath:error:
    ,在尝试使用error对象之前测试方法是否失败;好的,谢谢。这个问题已经解决了一年多了。我自己也知道;)好的,大卫,我错过了约会!希望能对其他新手有所帮助
        [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:dirToCopyTo error:&error];