【问题标题】:NSFileHandle fileHandleForWriting returns nil, error code 24NSFileHandle fileHandleForWriting 返回 nil,错误代码 24
【发布时间】:2013-08-30 21:34:52
【问题描述】:

我的应用中有一个将字符串写入文件末尾的方法:

-(void)log:(NSString *)str
{
  if (![[NSFileManager defaultManager] fileExistsAtPath:self.logPath])
    [[NSFileManager defaultManager] createFileAtPath:self.logPath contents:nil attributes:nil];

  NSError *err = nil;
NSFileHandle *myHandle = [NSFileHandle fileHandleForWritingToURL:[NSURL fileURLWithPath:self.logPath] error:&err];
if (!myHandle)
    NSLog(@"Failed to write file - %@", err.localizedDescription);
  [myHandle seekToEndOfFile];
  [myHandle writeData:[str dataUsingEncoding:NSUTF8StringEncoding]];
  [myHandle closeFile];
}

它工作了一段时间,然后开始失败; fileHandleForWritingToURL 返回nil。我得到的错误是 NSCocoaErrorDomain 错误 24。但我在任何地方都找不到对这个错误的任何引用。谷歌没有帮助。有没有人见过这个?我做错了吗?

【问题讨论】:

    标签: ios file-io nsfilehandle


    【解决方案1】:

    我的感觉是 NSCocoaErrorDomain 映射到 UNIX errno 值,而 errno 24 是“打开的文件太多”。仔细查看NSFileHandle class reference。还有,

    [myHandle seekToEndOfFile]; [myHandle writeData:[str dataUsingEncoding:NSUTF8StringEncoding]]; [myHandle closeFile];

    应该是你的其他情况

    if (!myHandle)

    测试。

    【讨论】:

    • 是的,我添加了 nil 检查,因为它刚刚停止写入,我不知道为什么。如果它有“打开的文件太多”,我是否没有正确关闭文件?
    • 你肯定需要调用 closeFile 或 fileHandleForWritingToURL 最终会失败并出现 NSCocoaErrorDomain 错误 24. 你在使用 ARC 吗? self.logPath 会改变吗? self.logPath 的值是多少?在它失败之前你可以调用你的 log 方法多少次?
    • self.logPath 是我要写入的字符串路径。我通过抓取文档目录来获取它。您可以将其视为函数中定义的有效路径的静态字符串。它没有改变。是的,这是使用 ARC。
    • 而且,您是否检测过在日志方法失败之前可以调用多少次?我已经在与您类似的情况下使用 NSFileHandle 代码进行了一些基准测试,并且仅在调用 closeFile 方法时看到 NSCocoaErrorDomain 错误 24。在一个紧密的循环中,在 OS X 和 iOS 上,在错误 24 发生之前,您可以在没有 closeFile 的情况下进行 9,000 多次迭代(这比我想象的要多)。使用 closeFile,我已经成功打开并写入了超过一百万条记录,并且没有出现错误。
    • 在它开始失败之前,我接到了大约 1,000 个电话。我很确定我打电话给closeFile;我的方法看起来就像它在问题中一样。但是我现在已经将我的应用程序更改为每次都不打开和关闭文件(只需通过会话打开/关闭)并且它工作正常。
    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 2016-11-07
    • 2016-10-05
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2014-07-03
    相关资源
    最近更新 更多