如何检查 Swift URL 是否为目录

问题描述 投票:0回答:5

如何检查 Swift URL 是否代表文件或目录?

URL 对象上有一个

hasDirectoryPath
属性,但其背后似乎没有任何“智能”。 它仅反映传递给 URL 的
isDirectory
值。

代码:

  let URL1 = URL(fileURLWithPath: FileManager.default.currentDirectoryPath)
  print(URL1.hasDirectoryPath)
  let URL2 = URL(fileURLWithPath: FileManager.default.currentDirectoryPath, isDirectory: true)
  print(URL2.hasDirectoryPath)

输出:

  false
  true
ios swift macos
5个回答
25
投票

名字说明了一切“hasDirectoryPath”。它没有说明该 URL 是一个目录并且它存在。它说它有一个目录路径。要确保 URL 是目录,您可以获取 URL ResourceKey isDirectoryKey:

extension URL {
    var isDirectory: Bool {
       (try? resourceValues(forKeys: [.isDirectoryKey]))?.isDirectory == true
    }
}

8
投票

我只是简化并升级了Leo回答的内容,并获得了更好的回报。

信息:在我的回答中,您会得到3种可能的结果,true这意味着该url是一个目录,false这意味着它不是一个目录,而是一个文件! nil 意味着它不是一个 Dir 或文件,因为我们可以给 url 一个虚拟 url 或一个网站,在这种情况下,您将返回 nil 和来自 Swift 的 bonus 信息,说明为什么返回是 nil并帮助您解决问题,让您了解url的情况。使用当前接受的答案,虚拟 URL 或无效 URL 可能会被某些开发人员误认为是文件。

extension URL {
    var isItemDirectory: Bool? {

        do {
            return (try resourceValues(forKeys: [URLResourceKey.isDirectoryKey]).isDirectory)
        }
        catch let error {
            print(error.localizedDescription)
            return nil
        }
        
    }
}

0
投票

我认为误解在于

URL(fileURLWithPath:)
URL(fileURLWithPath:isDirectory:)
是两个不同的构造函数,
false
没有默认值
isDirectory

如果

path
没有尾部斜杠,仅调用
URL(fileURLWithPath: path)
实际上会检查路径中是否存在目录。

我们可以通过检查 GitHub 上的实现来确认这一点:

public init(fileURLWithPath path: String) {
    let thePath: String = _standardizedPath(path)

    var isDir: ObjCBool = false
    if validPathSeps.contains(where: { thePath.hasSuffix(String($0)) }) {
        isDir = true
    } else {
#if !os(WASI)
            if !FileManager.default.fileExists(atPath: path, isDirectory: &isDir) {
                isDir = false
            }
#endif
    }
    super.init()
    _CFURLInitWithFileSystemPathRelativeToBase(_cfObject, thePath._cfObject, kCFURLPlatformPathStyle, isDir.boolValue, nil)
}

如果

path
does 末尾有一个“/”,则
hasDirectoryPath
将始终为 true。

这意味着您一定犯了一个错误,因为我无法重现您问题的输出。

URL(fileURLWithPath: FileManager.default.currentDirectoryPath).hasDirectoryPath

在 macOS 上为我返回
true


但是如果你想检查URL的路径中是否存在

当前
目录,你应该这样检查:

var isDirectory: ObjCBool = false
if FileManager.default.fileExists(atPath: url.path, isDirectory: &isDirectory) && isDirectory.boolValue else {
    // url is an existing directory
}

-2
投票

出于某种原因,Leo Dabus 的代码可以工作,但并非总是如此(!!!!!!!!!)。小心!

所以最好使用此代码:

extension URL {
    //IMPORTANT: this code return false even if file or directory does not exist(!!!)
    var isDirectory: Bool {
       return hasDirectoryPath
    }
}

-7
投票

它检查目录并返回 true 或 false

extension URL    {
    func checkFileExist() -> Bool {
        let path = self.path
        if (FileManager.default.fileExists(atPath: path))   {
            print("URL AVAILABLE")
            return true
        }else        {
            print("URL NOT AVAILABLE")
            return false;
        }
    }
}

用途:

if fileName.checkFileExist{
  // Here, do something
} 
© www.soinside.com 2019 - 2024. All rights reserved.