4

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

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

4 回答 4

5

我认为问题出在这一行:

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

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

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

你应该没事。

于 2010-05-15T11:43:19.650 回答
2

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

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

于 2010-05-15T11:44:15.157 回答
2

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

  1. 不好的用户体验(延迟和不连贯的行为)
  2. iOS 中的看门狗可以杀死你的应用程序,就好像它被卡住了一样。

所以在辅助线程中执行复制(或操作......或任何使用不同执行路径的东西)。

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

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

例如,我们复制一个 ZIP 文件并解压缩它,但这需要一些时间,所以我们必须将它放入一个计时器过程中,该过程将在完成时触发 UI。

如果你需要一个例子,让我知道。

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

  1. 只调用文件系统
  2. 要复制的字节少得多

坏消息:您必须使用例程解压缩 zip 文件,但您可以在网上找到它们。

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

于 2011-09-04T07:28:49.827 回答
1
    [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:dirToCopyTo error:&error];

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

文档说目标路径不能描述任何存在的东西:

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

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

您需要通过将所需的文件名附加到目标文件来使其成为目标文件的路径。那么它就不会存在(如果之前没有复制的话),所以复制会成功。

于 2010-05-15T19:53:47.320 回答