NSFileManager - 在启动时复制文件

时间:2010-05-15 11:35:43

标签: iphone cocoa document nsfilemanager copying

我需要从应用的资源文件夹中复制一些示例文件,然后将它们放在我应用的文档文件夹中。我想出了附加的代码,它编译得很好,但它不起作用。我引用的所有目录都存在。我不太确定我做错了什么,有人能指出我正确的方向吗?

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 WriteIt   Mobile [4587:207] DAMutableDictionary.h   2010-05-15 13:31:31.795 WriteIt   Mobile [4587:207] FileManager   错误:无法进行操作   完成。文件存在

编辑:我已经通过告诉NSFileManager复制文件目的地的名称来解决这个问题。

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

4 个答案:

答案 0 :(得分:5)

我认为问题出在这一行:

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

您在目标目录而不是源中列出文件。将其更改为:

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

你应该没事。

答案 1 :(得分:2)

我认为问题是你正在读取要从dirToCopyTo复制的文件,我认为你的意思是dirToCopyFrom

另外,要获取文档目录,您应该使用NSDocumentDirectory- (NSArray *)URLsForDirectory:(NSSearchPathDirectory)directory inDomains:(NSSearchPathDomainMask)domainMask

答案 2 :(得分:2)

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

  1. 用户体验不佳(延迟和缩减行为)
  2. iOS中的监视程序可以杀死您的应用程序,就像它被卡住了一样。
  3. 因此,在辅助线程(或操作......或使用不同执行路径的任何操作)中执行复制。

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

    • 禁用UI元素
    • 启动异步/线程操作
    • 完成复制回拨(通过通知,协议......或其他方式) 通知UI界面,它可以开始获取数据。

    例如,我们复制一个ZIP文件并对其进行解压缩,但这需要一些时间,所以我们不得不把它放在一个定时器程序中,它会在完成时触发UI。

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

    PS:
    使用ZIP文件进行复制更有效:

    1. 仅调用文件系统
    2. 要复制的字节少得多
    3. 坏消息:你必须使用例程解压缩zip文件,但你可以在网上找到它们。

      解压缩Zip文件应该更有效率,因为这些调用是用直接C编写的,而不是在Cocoa中有所有开销。

答案 3 :(得分:1)

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

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

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

  

...在操作之前,dstPath不得存在。

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

您需要通过向其添加所需的文件名,使其成为目标文件的路径。然后它将不存在(如果以前没有复制),所以副本将成功。