我正在iphone应用程序中读取文件。它的工作很好。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"%@",documentsDirectory);
NSString *fileName = [NSString stringWithFormat:@"%@/test.txt",documentsDirectory];
NSLog(@"%@",fileName);
NSString *content = [[NSString alloc] initWithContentsOfFile:fileName
usedEncoding:nil
error:nil];
NSLog (@"%@",content);
}
当我使用文件名test.txt
时,效果很好
但是当我在资源中添加另一个文件时,假设test1.txt
,则NSLog(@"%@",documentsDirectory)
和NSLog(@"%@",fileName)
会显示正确的结果。但是
NSLog (@"%@",content);
在null
中打印log
。那是什么原因?
我正在打印详细信息错误并打印
NSFilePath = "/Users/sam-xxx/Library/Application Support/iPhone Simulator/3.2/Applications/51197946-6042-4A90-AA39-F07F8A649308/Documents/test1.txt";
NSUnderlyingError = Error Domain=NSPOSIXErrorDomain Code=2 "Operation could not be completed. No such file or directory";
答案 0 :(得分:4)
最好检查是否返回错误:
NSError *error;
NSString *content = [[NSString alloc] initWithContentsOfFile:fileName
usedEncoding:nil
error: &error];
if (error) NSLog(@"Error !: %@", [error localizedDescription]);
那将(希望)给你一个关于最新情况的线索。
(编辑为示例包资源使用情况,因为文件位于包中而不是Documents目录中。)
NSBundle的文档在这里:NSBundle Documentation
你有2个选择,你建议的那个:
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:fileName];
将返回Bundle资源目录,并在该路径后附加文件名。
我个人更喜欢pathForResource:ofType:method:
NSString *filename = [[NSBundle mainBundle] pathForResource: @"test1" ofType: @"txt"];
因为这不仅会告诉您文件是否存在(如果不存在则返回nil),但如果您有文件,也会搜索本地化目录。
答案 1 :(得分:0)
您是否检查错误消息中的文件是否存在?在模拟器中运行时,只需打开Finder,按cmd + shift + g并将目录粘贴到文件中。
也许你没有把它添加到目标?打开资源中文件的信息窗口,检查选中的目标。
答案 2 :(得分:0)
在Simulator中运行应用程序时,可以使用Finder将正确的文件复制并粘贴到应用程序的Documents目录中,但是在iPhone或iTouch上,如何将文件粘贴到Documents目录中。
当应用程序在iPhone或iTouch上运行时,我们只有2种方法可以将内容放入Documents目录。
在您的代码中,您读取了Documents目录中的文件,您可以手动将文件粘贴到目录中使用Finder。试试这个。
NSString *path = [[NSBundle mainBundle] pathForResource:@"test.txt" ofType:nil];
NSString *content = [[NSString alloc] initWithContentsOfFile:path
usedEncoding:nil
error:nil];
NSLog (@"%@",content);