如何判断File.symlink是否受支持

时间:2013-10-26 13:33:14

标签: ruby windows symlink

在某些平台(Windows)上,Ruby不支持File.symlink,引发NotImplemented异常。我有一些代码可以使用或不使用符号链接,因此需要适应。

我想出的唯一方法是发现是否支持符号链接是尝试创建符号链接:

  def symlink_supported?
    Dir.mktmpdir do |dir|
      target_path = File.join(dir, 'target')
      symlink_path = File.join(dir, 'symlink')
      FileUtils.touch target_path
      begin
        FileUtils.ln_s target_path, symlink_path
        true
      rescue NotImplementedError
        false
      end
    end
  end

这很慢(很多文件系统操作!)并且看起来很笨重。缓慢可以通过memoization来处理,但这只会为已经笨重的方法增加更多的机制。

是否有更快或更优雅的方式来发现是否支持File.symlink

1 个答案:

答案 0 :(得分:3)

这来自test_fileuils.rb

def check_have_symlink?
  File.symlink nil, nil
rescue NotImplementedError
  return false
rescue
  return true
end

代码不会创建任何符号链接(它甚至不会触及文件系统)。在支持符号链接的系统上,由于TypeError参数而引发nil,否则(Windows)引发NotImplementedError