【问题标题】:Why does NSFileManager return TRUE on fileExistsAtPath when there is no such file?当没有这样的文件时,为什么 NSFileManager 在 fileExistsAtPath 上返回 TRUE?
【发布时间】:2011-01-28 04:24:16
【问题描述】:

NSFilemanager 正在为以下内容返回 true,此时应该还没有任何此类文件。发生了什么?

    if([myManager fileExistsAtPath:[[self documentsDirectory] stringByAppendingPathComponent:@"Music/songlist.txt"]]){

NSLog(@"file is there");

}

【问题讨论】:

  • 如果你做 NSLog(@"%@", [[self documentsDirectory] ​​stringByAppendingPathComponent:@"Music/songlist.txt"]]); - 也许文件路径有点错误?
  • 您是否在运行此代码之前创建了该文件并且没有将其删除?
  • 它正在返回 true,我什至重置了模拟器以清除所有文件。它仍然返回真实。在我开始下载之前,该文件不可能存在,因为我没有连接到网络。
  • 它可能正在查看路径是否存在 - 而不是文件。
  • [self documentsDirectory] 返回什么?

标签: iphone objective-c xcode nsfilemanager


【解决方案1】:

这符合我的预期。

 NSFileManager *myManager = [NSFileManager defaultManager];
NSString *documentsDirectory = NSHomeDirectory();

if([myManager fileExistsAtPath:[documentsDirectory stringByAppendingPathComponent:@"Music/songlist.txt"]]){

    NSLog(@"file is there");

}

【讨论】:

    【解决方案2】:

    NSFileManager 的文档似乎建议检查文件是否存在,而只是尝试读取文件并优雅地处理任何错误(例如 找不到文件 em> 错误)。您所描述的内容听起来不像是竞争条件(这是文档建议试图规避的内容),但是如果您只是尝试加载文件而不是检查它是否存在,会发生什么?例如,您可以尝试以下操作:

    NSError *error;
    NSStringEncoding encoding;
    NSString *fileContents = [NSString stringWithContentsOfFile:fileName
                                                   usedEncoding:&encoding
                                                          error:&error];
    
    if (fileContents == nil)
    {
        NSLog (@"%@", error);
    }
    else
    {
        NSLog (@"%@", fileContents);
    }
    

    如果你得到一个包含所有文件内容的字符串,那么文件显然就在那里。如果您收到错误消息,则说明 myManager 有问题。

    【讨论】:

    • 当您考虑大文件时,这是一个可怕的解决方案。您不想将大文件加载到内存中只是为了检查它们是否存在 =/
    • @valheru:您错过了答案的重点。如果您在尝试读取文件之前检查文件是否存在,那么您已经引入了竞争条件。最好的方法是立即尝试从文件中读取,如果失败,则适当地处理该错误。上面的示例只是一个将文件读入字符串的演示,但还有许多其他更有效的方法可以使用 Foundation 框架从文件中读取数据。同样,如我的回答所述,以上只是一个示例
    • 感谢您的澄清。我遇到该页面是因为我正在寻找一种方法来检查现有文件(无需立即从它们中读取)以显示列表。所以在这种情况下,当考虑更大的文件时,它可能会消耗性能。
    • @valheru:当您的程序只需要知道文件是否存在(例如锁定文件或类似文件)时,那么您是正确的,那么将毫无意义(并且可能对性能不利)如果您不关心文件的内容,请尝试阅读该文件。在这些情况下,fileExistsAtPath: 是要走的路。
    • 是的,我遇到了同样的竞争条件,我删除了一个文件并太快地检查它是否存在,但它仍然认为它存在。我最终可能会设置文件列表的内存缓存,或者尝试通过目录列表或其他方式进行检查。
    【解决方案3】:

    打印出来看看是不是你想要的。

    NSLog(@"Directory: %@", [[self documentsDirectory] stringByAppendingPathComponent:@"Music/songlist.txt"]];
    

    另外,请检查您是否正确定义了 myManager。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2011-04-29
      • 2014-12-13
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 2021-07-02
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多