如何检查 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
名字说明了一切“hasDirectoryPath”。它没有说明该 URL 是一个目录并且它存在。它说它有一个目录路径。要确保 URL 是目录,您可以获取 URL ResourceKey isDirectoryKey:
extension URL {
var isDirectory: Bool {
(try? resourceValues(forKeys: [.isDirectoryKey]))?.isDirectory == true
}
}
我只是简化并升级了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
}
}
}
我认为误解在于
URL(fileURLWithPath:)
和URL(fileURLWithPath:isDirectory:)
是两个不同的构造函数,false
没有默认值isDirectory
。
如果
path
没有尾部斜杠,仅调用 URL(fileURLWithPath: path)
实际上会检查路径中是否存在目录。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
true
。
但是如果你想检查URL
的路径中是否存在
当前目录,你应该这样检查:
var isDirectory: ObjCBool = false
if FileManager.default.fileExists(atPath: url.path, isDirectory: &isDirectory) && isDirectory.boolValue else {
// url is an existing directory
}
出于某种原因,Leo Dabus 的代码可以工作,但并非总是如此(!!!!!!!!!)。小心!
extension URL {
//IMPORTANT: this code return false even if file or directory does not exist(!!!)
var isDirectory: Bool {
return hasDirectoryPath
}
}
它检查目录并返回 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
}