Crystal lang 是否有可能获得断开符号链接的解析路径?

Crystal lang 是否有可能获得断开符号链接的解析路径?,crystal-lang,Crystal Lang,我一直无法找到一种方法来获取Crystal中断裂符号链接的目标路径: Dir.cd "/tmp" `ln -s a b` puts File.exists?(b) # false puts File.symlink?(b) # true 标准库中是否有任何东西可以获取断开链接指向的地址 这是通过Linux/MacOS实现的,不幸的是,它还没有在标准库中实现。这在GitHub上得到了跟踪,克斯特亚发布了一个版本,似乎可以解决这个问题 使用他的代码: lib LibC fun readlin

我一直无法找到一种方法来获取Crystal中断裂符号链接的目标路径:

Dir.cd "/tmp"
`ln -s a b`
puts File.exists?(b)  # false
puts File.symlink?(b) # true

标准库中是否有任何东西可以获取断开链接指向的地址

这是通过Linux/MacOS实现的,不幸的是,它还没有在标准库中实现。这在GitHub上得到了跟踪,克斯特亚发布了一个版本,似乎可以解决这个问题

使用他的代码:

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上不可用