【问题标题】:Is it possible to get the resolved path of a broken symbolic link?是否可以获得损坏的符号链接的解析路径?
【发布时间】:2018-06-21 02:31:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: crystal-lang


    【解决方案1】:

    这是通过readlink 在 Linux/MacOS 上完成的,遗憾的是尚未在标准库中实现。这在 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 上不可用。

    【讨论】:

      猜你喜欢
      • 2017-12-14
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多