2011-08-21 186 views
0

我已经写了一些代码来将应用程序包中的文件(dbtemplate.sqlite)复制到库中。但是,库中没有显示文件,每次启动应用程序时都会记录它复制模板的文本。控制台中没有显示错误。我究竟做错了什么?为什么NSFileManager无法正常工作?

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"); 

} 

回答

8

如果我没有记错,您必须将完整路径传入NSFileManager方法,并且使用带波浪号的前缀路径将不起作用。的

因此而不是使用@"~/Library/...",用途:

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

或者,更可靠地向NSFileManager请求应用程序支持中相关文件夹的路径。打开沙箱后,可能会/将会对某个路径进行硬编码(某些路径将会,某些路径可能会中断)。 –

+0

这是你的问题。 – SevenBits

0

我会建议在文档文件夹中保存文件,即时通讯不知道如果你甚至可以保存在库文件夹中的文件。使用该代码的文件夹中创建你的文件的路径:

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

并简单地检查它是否存在这样的:

if (![fileManager fileExistsAtPath:path]) 

所以不如你的文件移动到文件夹。

+0

它,有可能在图书馆保存在某些地方的文件;是否其中任何一个比文件更合适取决于文件的目的。 (文档仅适用于用户创建的内容。)无论采用哪种方式,合并装订路径都是不推荐使用的方法。正确的解决方案是向NSFileManager对象请求所需目录中的路径;当在Mac OS X下运行沙箱时,NSFileManager将解锁您对该文件的访问权限,而手工路径则不会。 –

1

我相信你的问题在于copyItemAtPath:,因为你给的字符串不是正确的路径。使用类似[[NSBundle mainBundle] pathForResourceWithName:]的东西来获取资源的实际路径。另外,我不确定〜你的路径是否被支持 - 你可能需要使用一些NSString函数来扩展它。

相关问题