我一直找不到在Crystal中获取断开的符号链接的目标路径的方法:
Dir.cd "/tmp"
`ln -s a b`
puts File.exists?(b) # false
puts File.symlink?(b) # true
Run Code Online (Sandbox Code Playgroud)
标准库中是否有任何东西可以获取断开链接指向的地址?
这是通过Linux在Linux / MacOS上完成的readlink,很遗憾,尚未在标准库中实现。在GitHub的第3284期中对此进行了跟踪,而kostya发布了一个似乎可以解决该问题的版本。
使用他的代码:
lib LibC
fun readlink(pathname : Char*, buf : Char*, bufsiz : SizeT) : SizeT
end
def File.readlink(path)
buf = uninitialized UInt8[1024]
size = LibC.readlink(path.to_unsafe, buf.to_unsafe, 1024).to_i32
if size == -1
raise Errno.new("readlink")
elsif size > 1024
raise "buffer too small"
else
return String.new(buf.to_unsafe, size)
end
end
Run Code Online (Sandbox Code Playgroud)
然后调用该函数:
File.symlink("a", "b")
puts File.readlink("b") # => a
Run Code Online (Sandbox Code Playgroud)
但是请注意,您可能需要做一些工作才能获得绝对路径。直接使用命令行版本可能更可行,因为您可以传递-f给出绝对路径的标志:
File.symlink("a", "b")
puts `readlink -f b` # => /path/to/a
Run Code Online (Sandbox Code Playgroud)
该-f-flag不可在MacOS虽然。
| 归档时间: |
|
| 查看次数: |
36 次 |
| 最近记录: |