crystal-lang - 是否可以获得损坏的符号链接的解析路径?
问题描述
我一直无法找到一种方法来获取 Crystal 中损坏的符号链接的目标路径:
Dir.cd "/tmp"
`ln -s a b`
puts File.exists?(b) # false
puts File.symlink?(b) # true
标准库中有什么东西可以获取断开的链接指向的地址吗?
解决方案
这是在 Linux/MacOS 上通过 完成的readlink
,遗憾的是尚未在标准库中实现。这在 GitHub 上的issue #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
然后调用该函数:
File.symlink("a", "b")
puts File.readlink("b") # => a
但是请注意,您可能需要做一些工作才能获得绝对路径。直接使用命令行版本可能更可行,因为您可以传递-f
提供绝对路径的标志:
File.symlink("a", "b")
puts `readlink -f b` # => /path/to/a
但是-f
-flag 在 MacOS 上不可用。
推荐阅读
- c# - 无法右键单击上下文菜单条 c#
- javascript - iframe 检测键,无需点击
- javascript - 我的 html 表单操作在浏览器中显示 javascript 代码
- javascript - 什么是 JS 等价于 Ruby :tr 方法?
- node.js - 错误:找不到模块“./options/SchemaTypeOptions”
- d3.js - 从工具提示还原更改
- python - Python tkinter 按钮命令
- firebase - 为什么有“firebase”时会有“@firebase/app”npm 包?
- sql - 如何使用 Haskell 中的 Beam 库编写返回嵌套列表的查询?
- c# - 如何对通过启动多个实例来旋转线程的内置 c# 程序 (program.exe) 进行压力测试