这是一个不依赖于NSString
类并适用于 Swift 4 的解决方案:
func absURL ( _ path: String ) -> URL {
guard path != "~" else {
return FileManager.default.homeDirectoryForCurrentUser
}
guard path.hasPrefix("~/") else { return URL(fileURLWithPath: path) }
var relativePath = path
relativePath.removeFirst(2)
return URL(fileURLWithPath: relativePath,
relativeTo: FileManager.default.homeDirectoryForCurrentUser
)
}
func absPath ( _ path: String ) -> String {
return absURL(path).path
}
测试代码:
print("Path: \(absPath("~"))")
print("Path: \(absPath("/tmp/text.txt"))")
print("Path: \(absPath("~/Documents/text.txt"))")
将代码分成两种方法的原因是,现在您在处理文件和文件夹时更希望使用 URL,而不是字符串路径(所有新 API 都使用 URL 作为路径)。
顺便说一句,如果您只想知道~/Desktop
或~/Documents
类似文件夹的绝对路径,还有一种更简单的方法:
let desktop = FileManager.default.urls(
for: .desktopDirectory, in: .userDomainMask
)[0]
print("Desktop: \(desktop.path)")
let documents = FileManager.default.urls(
for: .documentDirectory, in: .userDomainMask
)[0]
print("Documents: \(documents.path)")