【问题标题】:Why is NSFileManager not working?为什么 NSFileManager 不工作?
【发布时间】:2023-04-01 15:02:02
【问题描述】:

我编写了一些代码来将文件 (dbtemplate.sqlite) 从应用程序包复制到库。但是,库中没有文件显示,每次我启动应用程序时,它都会记录它复制模板的文本。控制台中没有显示任何错误。我做错了什么?

NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:@"~/Library/AppSafe/database/db.sqlite"]) {

    [fileManager createDirectoryAtPath:@"~/Library/AppSafe/database" withIntermediateDirectories:YES attributes:nil error:nil];

    [fileManager copyItemAtPath:@"dbtemplate.sqlite" toPath:@"~/Library/AppSafe/database/db.sqlite" error:nil];
    NSLog(@"copied template");

}

【问题讨论】:

    标签: cocoa nsfilemanager


    【解决方案1】:

    如果我没记错的话,您必须将完整路径传递给 NSFileManager 方法,并且使用波浪号前缀的路径是行不通的。

    所以不要使用@"~/Library/...",而是使用:

    [@"~/Library/..." stringByExpandingTildeInPath]
    

    【讨论】:

    • 或者,更可靠的是,向 NSFileManager 询问应用程序支持中相关文件夹的路径。打开沙盒后,硬编码路径可能/将会(某些路径会,某些路径可能)中断。
    【解决方案2】:

    我相信您的问题在于copyItemAtPath:,因为您提供的字符串不是正确的路径。使用 [[NSBundle mainBundle] pathForResourceWithName:] 之类的东西来获取资源的实际路径。另外,我不确定您的路径中的 ~ 是否受支持 - 您可能需要使用 NSString 的某些功能来扩展它。

    【讨论】:

      【解决方案3】:

      我建议将文件保存在文档文件夹中,我不确定您是否甚至可以将文件保存在库文件夹中。使用此代码在文档文件夹中创建文件路径:

      NSString *path = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];
      

      然后像这样检查它是否存在:

      if (![fileManager fileExistsAtPath:path])
      

      所以最好将你的文件移动到文档文件夹中。

      【讨论】:

      • 可以在Library的特定位置保存文件;它们中的任何一个是否比 Documents 更合适取决于文件的目的。 (文档仅适用于用户创建的内容。)无论哪种方式,将路径装订在一起都是一种已弃用的方法。正确的解决方案是向 NSFileManager 对象询问所需目录中的路径;在 Mac OS X 下运行沙盒时,NSFileManager 将解锁您对该文件的访问权限,而手工路径不会。
      猜你喜欢
      • 2016-10-10
      • 1970-01-01
      • 2011-06-05
      • 2018-02-23
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      相关资源
      最近更新 更多