如何检查Swift URL是否为目录

3gtaxfhh  于 2023-06-21  发布在  Swift
关注(0)|答案(5)|浏览(162)

如何检查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
fdbelqdn

fdbelqdn1#

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

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

edqdpe6u2#

我只是简化和升级什么利奥回答更好的回报。

    • 信息:在我的回答中,你会得到3种可能的结果,true表示URL是一个目录,false表示它不是一个目录,而是一个文件! * nil表示它不是一个Dir或文件,因为我们可以给url一个虚拟的url或一个网站,在这种情况下,你会返回nil和一个bonus*来自Swift的信息,关于为什么返回nil**,并帮助你解决问题,让你知道url是什么情况。使用当前接受的答案,一些开发人员可能会将虚拟URL或无效URL误理解为文件。
extension URL {
    var isDirectory: Bool? {

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

t1qtbnec3#

我认为误解在于URL(fileURLWithPath:)URL(fileURLWithPath:isDirectory:)是两个不同的构造函数,isDirectory没有默认值false
如果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 * 在末尾有一个“/”,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
}
umuewwlo

umuewwlo4#

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

所以最好使用这个代码:

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

vm0i2vca5#

它检查目录并返回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
}

相关问题