Cocoa 为什么NSFileManager不工作?
我编写了一些代码,将一个文件(dbtemplate.sqlite)从应用程序包复制到库中。但是,库中没有显示任何文件,每次启动应用程序时,它都会记录复制模板的文本。控制台中没有显示任何错误。我做错了什么Cocoa 为什么NSFileManager不工作?,cocoa,nsfilemanager,Cocoa,Nsfilemanager,我编写了一些代码,将一个文件(dbtemplate.sqlite)从应用程序包复制到库中。但是,库中没有显示任何文件,每次启动应用程序时,它都会记录复制模板的文本。控制台中没有显示任何错误。我做错了什么 NSFileManager *fileManager = [NSFileManager defaultManager]; if (![fileManager fileExistsAtPath:@"~/Library/AppSafe/database/db.sqlite"]) { [f
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");
}
我建议将文件保存在documents文件夹中,我不确定您是否可以将文件保存在library文件夹中。使用以下代码在“文档”文件夹中创建文件的路径:
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];
只需检查它是否存在如下情况:
if (![fileManager fileExistsAtPath:path])
因此,最好将您的文件移动到documents文件夹。我认为您的问题在于
copyItemAtPath:
,因为您给出的字符串不是正确的路径。使用类似于[[NSBundle mainBundle]pathForResourceWithName:::
的方法获取资源的实际路径。另外,我不确定路径中的~是否受支持-您可能需要使用NSString的某些函数来扩展它。如果我没记错的话,您必须将完整路径传递到NSFileManager
方法中,并且使用波浪号前缀的路径将不起作用
因此,不要使用@“~/Library/…”
,而是使用:
[@"~/Library/..." stringByExpandingTildeInPath]
或者,更可靠的方法是,向NSFileManager询问应用程序支持中相关文件夹的路径。打开沙箱后,硬编码路径可能/将(某些路径将,某些路径可能)中断。可以在库中的某些位置保存文件;这些文件是否比文件更合适取决于文件的用途。(文档仅用于用户创建的内容。)无论哪种方式,将路径装订在一起都是一种不推荐的方法。正确的解决方案是向NSFileManager对象询问所需目录中的路径;在Mac OS X下运行沙盒时,NSFileManager将解锁您对该文件的访问权限,而手动路径则不会。