Swift: 如何扩展路径字符串中的波浪号
Swift: How to expand a tilde in a path String
如何在 Swift 中扩展带有波浪号的路径字符串?我有一个像 "~/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)
波浪号扩展
Swift 1
"~/Desktop".stringByExpandingTildeInPath
Swift 2
NSString(string: "~/Desktop").stringByExpandingTildeInPath
Swift 3
NSString(string: "~/Desktop").expandingTildeInPath
主目录
此外,您可以像这样获取主目录 (returns a String
/String?
):
NSHomeDirectory()
NSHomeDirectoryForUser("<User>")
在 Swift 3 和 OS X 10.12 中也可以使用这个 (returns a URL
/URL?
):
FileManager.default().homeDirectoryForCurrentUser
FileManager.default().homeDirectory(forUser: "<User>")
编辑:在 Swift 3.1 中已更改为 FileManager.default.homeDirectoryForCurrentUser
这是一个不依赖于 NSString
class 并且适用于 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)")
Return 字符串:
func expandingTildeInPath(_ path: String) -> String {
return path.replacingOccurrences(of: "~", with: FileManager.default.homeDirectoryForCurrentUser.path)
}
Return URL:
func expandingTildeInPath(_ path: String) -> URL {
return URL(fileURLWithPath: path.replacingOccurrences(of: "~", with: FileManager.default.homeDirectoryForCurrentUser.path))
}
如果OS小于10.12,替换
FileManager.default.homeDirectoryForCurrentUser
和
URL(fileURLWithPath: NSHomeDirectory()
Swift 4 分机
public extension String {
public var expandingTildeInPath: String {
return NSString(string: self).expandingTildeInPath
}
}
如何在 Swift 中扩展带有波浪号的路径字符串?我有一个像 "~/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)
波浪号扩展
Swift 1
"~/Desktop".stringByExpandingTildeInPath
Swift 2
NSString(string: "~/Desktop").stringByExpandingTildeInPath
Swift 3
NSString(string: "~/Desktop").expandingTildeInPath
主目录
此外,您可以像这样获取主目录 (returns a String
/String?
):
NSHomeDirectory()
NSHomeDirectoryForUser("<User>")
在 Swift 3 和 OS X 10.12 中也可以使用这个 (returns a URL
/URL?
):
FileManager.default().homeDirectoryForCurrentUser
FileManager.default().homeDirectory(forUser: "<User>")
编辑:在 Swift 3.1 中已更改为 FileManager.default.homeDirectoryForCurrentUser
这是一个不依赖于 NSString
class 并且适用于 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)")
Return 字符串:
func expandingTildeInPath(_ path: String) -> String {
return path.replacingOccurrences(of: "~", with: FileManager.default.homeDirectoryForCurrentUser.path)
}
Return URL:
func expandingTildeInPath(_ path: String) -> URL {
return URL(fileURLWithPath: path.replacingOccurrences(of: "~", with: FileManager.default.homeDirectoryForCurrentUser.path))
}
如果OS小于10.12,替换
FileManager.default.homeDirectoryForCurrentUser
和
URL(fileURLWithPath: NSHomeDirectory()
Swift 4 分机
public extension String {
public var expandingTildeInPath: String {
return NSString(string: self).expandingTildeInPath
}
}