【问题标题】:Read/write file in Documents directory problemDocuments 目录中的读/写文件问题
【发布时间】:2011-09-23 16:45:23
【问题描述】:

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

我目前被困在我的文档目录中没有写入任何内容

(在我的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 对象并得到了这个错误:

错误:错误域=NSCocoaErrorDomain Code=512“操作无法完成。(Cocoa 错误 512。)”UserInfo=0x12aa00 {NSFilePath=/var/mobile/Applications/887F4691-3B75-448F-9384-31EBF4E3B63E /Documents/file1.txt, NSUnderlyingError=0x14f6b0 "操作无法完成。不是目录"}

[编辑 2] 这在模拟器上可以正常工作,但在我的手机上却不行:/

【问题讨论】:

  • 您应该做的第一件事是查看您的写操作是否产生任何错误。在对writeToFile:的调用中,传入一个NSError对象并在调用后检查错误。
  • 试试[text writeToFile:textPath atomically:YES encoding:NSUTF8StringEncoding error:NULL];。请注意这里的区别是您正在执行原子写入。查看[NSString writeToFile:atomically:encoding:error:] 的 Apple Docs 以了解其背后的原因。另外,由于错误是在抱怨目录,请在设备上调试您的应用程序以查看文件的路径。
  • 我也尝试过更改原子值,但没有任何区别。
  • 好吧,我刚刚在我的机器和 iPad 上按原样尝试了您的代码,并且都可以工作:-/。不知道该告诉你什么,除非在另一台设备上尝试相同的代码,看看你是否得到相同的结果。从错误来看,问题似乎是无法访问文件路径。如果您能找到某种方法直接访问文件系统以验证可能有帮助的结构(以编程方式或其他方式)。我用谷歌搜索发现Phone Disk。我没有尝试过,所以如果它搞砸了您的设备,请不要激怒我:) ...如果您确实找到了解决方案,请发布答案以帮助他人。

标签: iphone objective-c ios nsfilemanager


【解决方案1】:

您也可以使用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];

在文件写入结束时,您应该关闭文件。

您还可以检查写入文件中的内容为NSString 以获取@Glenn Smith 上面提到的调试观点:

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

【讨论】:

    【解决方案2】:

    通过在 die info.plist 中设置非标准 Bundle ID 解决了问题

    我为这个特定的应用程序使用了来自 iTunes Connect 的 Bundle ID。现在一切正常。

    【讨论】:

    • 不确定更改 Bundle id 是否会有所帮助。
    • 删除如果已经存在的话: if ([[NSFileManager defaultManager] fileExistsAtPath:targetPath]) { [[NSFileManager defaultManager] removeItemAtPath:targetPath error:nil]; }
    【解决方案3】:

    在您设置变量值的每一行之后放置一个NSLog 语句,以便您可以检查这些值。这应该可以帮助您快速查明哪里出了问题。

    【讨论】:

      【解决方案4】:

      不要使用 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);
      }
      

      编辑:添加错误检查代码。

      【讨论】:

        【解决方案5】:

        你是怎么得到documentsDirectory的?

        你应该使用这样的东西:

        NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
        
        NSString *documentsDirectory = [pathArray lastObject];
        

        【讨论】:

        • 不,这不是问题。我用了那个代码。 (将其编辑为问题)。还是谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 2013-11-27
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        • 2021-03-01
        相关资源
        最近更新 更多