代码之家  ›  专栏  ›  技术社区  ›  dgo.a

是否可以获得断开的符号链接的解析路径?

  •  3
  • dgo.a  · 技术社区  · 8 年前

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

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

    在标准库中有什么东西可以获取断开链接指向的地址吗?

    1 回复  |  直到 8 年前
        1
  •  5
  •   Sven    8 年前

    这是在Linux/MacOS上通过 readlink 很遗憾,标准库中还没有实现。这是跟踪的 issue #3284 在Github上,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 -不过,标记在MacOS上不可用。