为啥 NSFileManager 不工作?

Posted

技术标签:

【中文标题】为啥 NSFileManager 不工作?【英文标题】:Why is NSFileManager not working?为什么 NSFileManager 不工作? 【发布时间】:2011-08-21 15:29:28 【问题描述】:

我编写了一些代码来将文件 (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");


【问题讨论】:

【参考方案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 将解锁您对该文件的访问权限,而手工路径不会。

以上是关于为啥 NSFileManager 不工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 NSFileManager 找不到这些 png 文件?

当路径正确时,为啥 NSFIleManager -fileExistsAtPath 找不到现有文件?

NSFilemanager 的使用

.xcodeproj 文件的 NSFileManager 文件大小不正确

NSFileManager:无法正常工作

NSFileManager 在没有管理员权限的情况下无法工作