如何在Swift中使用波浪号扩展路径String?我有一个类似"~/Desktop"
的字符串,我希望将此路径与NSFileManager
方法一起使用,这需要将代字号扩展为"/Users/<myuser>/Desktop"
。
(这个带有明确问题陈述的问题尚不存在,这应该很容易找到。一些类似但不令人满意的问题是Can not make path to the file in Swift,Simple way to read local file using Swift?,Tilde-based Paths in Objective-C)
答案 0 :(得分:25)
"~/Desktop".stringByExpandingTildeInPath
NSString(string: "~/Desktop").stringByExpandingTildeInPath
NSString(string: "~/Desktop").expandingTildeInPath
此外,您可以像这样获取主目录(返回String
/ String?
):
NSHomeDirectory()
NSHomeDirectoryForUser("<User>")
在Swift 3和OS X 10.12中,它也可以使用它(返回URL
/ URL?
):
FileManager.default().homeDirectoryForCurrentUser
FileManager.default().homeDirectory(forUser: "<User>")
编辑:在Swift 3.1中,这已改为FileManager.default.homeDirectoryForCurrentUser
答案 1 :(得分:3)
返回字符串:
func expandingTildeInPath(_ path: String) -> String {
return path.replacingOccurrences(of: "~", with: FileManager.default.homeDirectoryForCurrentUser.path)
}
返回网址:
func expandingTildeInPath(_ path: String) -> URL {
return URL(fileURLWithPath: path.replacingOccurrences(of: "~", with: FileManager.default.homeDirectoryForCurrentUser.path))
}
如果操作系统低于10.12,请更换
FileManager.default.homeDirectoryForCurrentUser
使用
URL(fileURLWithPath: NSHomeDirectory()
答案 2 :(得分:0)
这是一个不依赖于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)")
答案 3 :(得分:0)
Swift 4扩展程序
public extension String {
public var expandingTildeInPath: String {
return NSString(string: self).expandingTildeInPath
}
}