为啥 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 找不到现有文件?