【问题标题】:NSFileManager - Copying Files at StartupNSFileManager - 在启动时复制文件
【发布时间】:2023-03-29 21:50:01
【问题描述】:

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

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 写它 移动[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];

【问题讨论】:

标签: iphone cocoa document nsfilemanager copying


【解决方案1】:

我认为问题出在这一行:

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

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

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

你应该没事的。

【讨论】:

  • 谢谢!这确实是问题所在。现在我又打了一个 - 这是我的日志输出: 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] FileManager 错误:操作无法完成。文件存在等等……等等……这到底是什么意思?
  • 您似乎正在尝试覆盖文件。复制之前 - 确保它不存在。
  • 但是 Documents 目录是空的?这就是我感到惊讶的原因?
  • 即使在重置 iPhone 模拟器后,它仍然显示相同的内容。
【解决方案2】:

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

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

【讨论】:

  • 这并不重要,因为两者都返回相同的结果;)
  • 在非英文版的 OSX 中,目录总是 Documents 吗?
  • 是的,马克,我的 iPhone 设置为德语,所有文档目录仍称为“文档”。
  • Mark:iPhone 上不存在这种方法。 iPhone应用程序中的唯一方法(除了从整块布上伪造路径)是NSSearchPathForDirectoriesInDomains函数:developer.apple.com/iphone/library/documentation/Cocoa/…
【解决方案3】:

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

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

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

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

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

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

如果您需要示例,请告诉我。

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

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

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

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

【讨论】:

  • 好的,谢谢。这个问题已经有一年多了,已经解决了。我自己也知道;)
  • 好的,大卫,我错过了约会!希望这可以帮助其他新手
【解决方案4】:
    [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:dirToCopyTo error:&error];

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2014-11-11
    • 2011-06-09
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多