在某些平台(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?
答案 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
。