文档目录中的读/写文件问题

时间:2011-06-27 17:15:58

标签: iphone objective-c ios nsfilemanager

我正在尝试将一个非常基本的文本字符串写入我的文档目录,然后从那里开始工作以保存其他文件等。

我目前坚持不写任何内容到我的文档目录

(在我的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] 这在模拟器上工作正常,但在我的手机上没有:/

5 个答案:

答案 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);
}