代码之家  ›  专栏  ›  技术社区  ›  Peter Hosey

使用NSURL测试文件存在性

  •  70
  • Peter Hosey  · 技术社区  · 16 年前

    Snow Leopard引入了许多新方法来使用NSURL对象引用文件,而不是路径名或核心服务的FSREF。

    然而,有一项任务我找不到基于URL的方法:测试文件是否存在。我正在寻找一个基于URL的 -[NSFileManager fileExistsAtPath: ] . 像那个方法一样,它应该返回 YES

    我可以尝试查找各种 resource values NSURLEffectiveIconKey )如果这样做的话,成本可能会很高。

    我可以用NSFileManager的 fileExistsAtPath: ,但如果有更现代的方法,我更愿意使用它。

    Cocoa、CF或核心服务中是否有一个简单的方法或功能可以保证/记录下来,以告诉我给定的文件(或文件引用)URL是否引用存在的文件系统对象?

    6 回复  |  直到 16 年前
        1
  •  143
  •   Elise van Looij    16 年前

    - (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error
    

    它“返回是否可以访问文件URL指向的资源。”

    NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" 
                   isDirectory:NO];
    NSError *err;
    if ([theURL checkResourceIsReachableAndReturnError:&err] == NO)
        [[NSAlert alertWithError:err] runModal];
    
        2
  •  30
  •   António Azevedo    15 年前

    在iOS上我找不到任何其他方法。。。

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"];
    if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...}
    
        3
  •  10
  •   William Entriken    10 年前

    这是你的电话号码 答复:

    var error:NSError?
    let folderExists = theURL.checkResourceIsReachableAndReturnError(&error)
    
        4
  •  2
  •   Peter Hosey    16 年前

    您应该使用缓存实现自己的异步检查例程,该缓存单独创建有效资源的列表。

    否则,cfurlResources的注释可在标头状态下删除:

    关于某一特定文件的存在。在执行 操作(如打开文件),只需尝试 操作和处理故障,而不是首先检查可达性。

        5
  •  1
  •   Laurent Etiemble    16 年前

    因为NSURL可以代表更多的本地文件系统,所以我认为没有一种通用方法可以可靠地测试它们的存在。至少,可可基金会并没有包含这样的功能(据我所知)。

    如果您只处理本地文件系统,我建议您为其创建一个类别 NSURL 还是为了 NSFileManager ,带有 urlExists: NSURL NSString [NSFileManager fileExistsAtPath:]

        6
  •  0
  •   Abhi Beckert    8 年前

    在Swift中,您可以使用 checkResourceIsReachable() true (如果可以访问该文件)或抛出错误(解释无法访问该文件的原因)。

    要获取布尔真/假值,请使用以下语法:

    let exists = (try? inputFile.checkResourceIsReachable()) ?? false
    

    let exists: Bool
    do {
      exists = try inputFile.checkResourceIsReachable()
    } catch {
      exists = false
      print(error.localizedDescription)
    }
    

    一般来说,首选的方法不是检查文件是否存在,而是简单地尝试读取或写入文件,并在失败后处理任何错误。