Swift:如何在路径字符串中展开波浪



如何在Swift中扩展路径字符串?我有一个像"~/Desktop"这样的字符串,我想用NSFileManager方法使用这个路径,这需要将波浪扩展到"/Users/<myuser>/Desktop"

(这个问题没有明确的问题说明,应该很容易找到。一些类似但不令人满意的问题是不能在Swift中创建文件路径,使用Swift读取本地文件的简单方法?

波浪展开

迅速1

"~/Desktop".stringByExpandingTildeInPath

迅速2

NSString(string: "~/Desktop").stringByExpandingTildeInPath
迅速

3

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

返回字符串:

func expandingTildeInPath(_ path: String) -> String {
    return path.replacingOccurrences(of: "~", with: FileManager.default.homeDirectoryForCurrentUser.path)
}

返回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()

4迅速扩展

public extension String {
    public var expandingTildeInPath: String {
        return NSString(string: self).expandingTildeInPath
    }
}

这是一个不依赖于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)")

相关内容

  • 没有找到相关文章

最新更新