我正在尝试将一个非常基本的文本字符串写入我的文档目录,然后从那里开始工作以保存其他文件等。
我目前坚持不写任何内容到我的文档目录
(在我的viewDidLoad
)
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
NSString *documentsDirectory = [pathArray objectAtIndex:0];
NSString *textPath = [documentsDirectory stringByAppendingPathComponent:@"file1.txt"];
NSString *text = @"My cool text message";
[[NSFileManager defaultManager] createFileAtPath:textPath contents:nil attributes:nil];
[text writeToFile:textPath atomically:NO encoding:NSUTF8StringEncoding error:NULL];
NSLog(@"Text file data: %@",[[NSFileManager defaultManager] contentsAtPath:textPath]);
这是打印出来的:
2011-06-27 19:04:43.485 MyApp [5731:707]文本文件数据:(null)
如果我试试这个,它也会打印出null:
NSLog(@"My Documents: %@", [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:NULL]);
在写这个文件时我错过了什么或者我做错了什么? 可能是我需要在我的plist或某些框架/导入中更改的东西吗?
由于
[编辑] 我通过writeToFile传递了一个NSError对象并得到了这个错误:
错误:错误Domain = NSCocoaErrorDomain Code = 512“操作无法完成。(Cocoa错误512.)”UserInfo = 0x12aa00 {NSFilePath = / var / mobile / Applications / 887F4691-3B75-448F-9384-31EBF4E3B63E /Documents/file1.txt,NSUnderlyingError = 0x14f6b0“操作无法完成。不是目录”}
[编辑2] 这在模拟器上工作正常,但在我的手机上没有:/
答案 0 :(得分:2)
不要使用NSFileManager来获取该文件的内容,而是尝试使用NSString:
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
NSString *documentsDirectory = [pathArray objectAtIndex:0];
NSString *textPath = [documentsDirectory stringByAppendingPathComponent:@"file1.txt"];
NSError *error = nil;
NSString *str = [NSString stringWithContentsOfFile:textPath encoding:NSUTF8StringEncoding error:&error];
if (error != nil) {
NSLog(@"There was an error: %@", [error description]);
} else {
NSLog(@"Text file data: %@", str);
}
编辑:添加了错误检查代码。
答案 1 :(得分:1)
你是如何获得documentsDirectory
的?
你应该使用这样的东西:
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
NSString *documentsDirectory = [pathArray lastObject];
答案 2 :(得分:0)
在设置变量值的每一行之后放置一个NSLog
语句,以便检查这些值。这应该可以帮助您快速查明出现问题的地方。
答案 3 :(得分:0)
通过在info.plist
中设置非标准Bundle ID解决了这个问题我使用iTunes Connect中的Bundle ID来获取此特定应用。现在一切都很完美。
答案 4 :(得分:0)
您还可以使用NSFileHandle
在文件中写入数据并保存到文档目录:
创建NSFileHandle
NSFileHandle *outputFileHandle;
使用prepareDataWrittenHandle
函数在文件扩展名为
-(void)prepareDataWrittenHandle:(NSString *)filename
{
//Create Path of file in document directory.
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *outputFilePath = [documentsDirectory stringByAppendingPathComponent:filename];
//Check file with above name is already exits or not.
if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath] == NO) {
NSLog(@"Create the new file at outputFilePath: %@", outputFilePath);
//Create file at path.
BOOL suc = [[NSFileManager defaultManager] createFileAtPath:outputFilePath
contents:nil
attributes:nil];
NSLog(@"Create file successful?: %u", suc);
}
outputFileHandle = [NSFileHandle fileHandleForWritingAtPath:outputFilePath];
}
然后将字符串值写入文件:
//Create a file
[self prepareDataWrittenHandle:@"file1.txt"];
//String to save in file
NSString *text = @"My cool text message";
//Convert NSString to NSData to save data in file.
NSData* data = [text dataUsingEncoding:NSUTF8StringEncoding]
//Write NSData to file
[_outputFileHandle writeData:data];
//close the file if written complete
[_outputFileHandle closeFile];
在文件末尾你应该关闭文件。
如上所述,@ Glenn Smith还可以检查文件中以NSString
编写的内容作为调试观点:
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *outputFilePath = [documentsDirectory stringByAppendingPathComponent:@"file1.txt"];
NSError *error;
NSString *str = [NSString stringWithContentsOfFile:outputFilePath encoding:NSUTF8StringEncoding error:&error];
if (error != nil) {
NSLog(@"There was an error: %@", [error description]);
} else {
NSLog(@"Text file data: %@", str);
}