Swift: How to expand a tilde in a path String

前端 未结 4 1116
小蘑菇
小蘑菇 2021-02-20 04:22

How can I expand a path String with a tilde in Swift? I have a string like \"~/Desktop\" and I\'d like to use this path with the NSFileManager methods,

4条回答
  •  广开言路
    2021-02-20 04:32

    Here is a solution that does not depend on the NSString class and works with 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
    }
    

    Test code:

    print("Path: \(absPath("~"))")
    print("Path: \(absPath("/tmp/text.txt"))")
    print("Path: \(absPath("~/Documents/text.txt"))")
    

    The reason for splitting the code into two methods is that nowadays you rather want URLs when working with files and folders and not string paths (all new APIs use URLs for paths).

    By the way, if you just want to know the absolute path of ~/Desktop or ~/Documents and similar folders, there's an even easier way for that:

    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)")
    

提交回复
热议问题