gpt4 book ai didi

Swift 相当于 Ruby 的 "Pathname.relative_path_from"

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:07 30 4
gpt4 key购买 nike

鲁比的 Pathname.relative_path_from文档。

在 objc 中已经有 KSFileUtilities' ks_stringRelativeToURL方法,那是非常接近的。我正在寻找可以在 Linux 上运行的纯 Swift 解决方案。

我更喜欢使用 file:// URL 的解决方案,但是 String 也可以。

文件系统可以区分大小写/不区分大小写。确定相对路径可能很棘手。

输入和预期输出示例:

| Long Path                      | Relative to Path | Return Value      |
|--------------------------------|------------------|-------------------|
| /usr/X11/agent/47.gz | /usr/X11 | agent/47.gz |
| /usr/share/man/meltdown.1 | /usr/share/cups | ../man/meltdown.1 |
| file:///var/logs/x/y/z/log.txt | file:///var/logs | x/y/z/log.txt |

Swift 已经有 FileManager.getRelationship(_:of:in:toItemAt:) , 但它不返回相对路径。

最佳答案

Swift 标准库或据我所知,基础框架。

作为URL的扩展方法,这里有一个可能的实现:

extension URL {
func relativePath(from base: URL) -> String? {
// Ensure that both URLs represent files:
guard self.isFileURL && base.isFileURL else {
return nil
}

// Remove/replace "." and "..", make paths absolute:
let destComponents = self.standardized.pathComponents
let baseComponents = base.standardized.pathComponents

// Find number of common path components:
var i = 0
while i < destComponents.count && i < baseComponents.count
&& destComponents[i] == baseComponents[i] {
i += 1
}

// Build relative path:
var relComponents = Array(repeating: "..", count: baseComponents.count - i)
relComponents.append(contentsOf: destComponents[i...])
return relComponents.joined(separator: "/")
}
}

我的测试代码:

func test(_ p1: String, _ p2: String) {
let u1 = URL(fileURLWithPath: p1)
let u2 = URL(fileURLWithPath: p2)
print(u1.relativePath(from: u2) ?? "<ERROR>")
}
test("/usr/X11/agent/47.gz", "/usr/X11") // "agent/47.gz"
test("/usr/share/man/meltdown.1", "/usr/share/cups") // "../man/meltdown.1"
test("/var/logs/x/y/z/log.txt", "/var/logs") // "x/y/z/log.txt"

备注:

  • >“。”给定 URL 中的和“..”被删除,相对文件 URL是绝对的(都使用 URLstandardized 方法)。
  • 区分大小写处理。
  • 假定基本 URL 代表一个目录。

附录: @neoneye 将其包装到一个 Swift 包中: SwiftyRelativePath .

关于Swift 相当于 Ruby 的 "Pathname.relative_path_from",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48351839/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com