当存在目录的符号链接时,Ruby FileUtils.rm_r在Windows上失败:备选方案?

时间:2015-01-17 02:16:19

标签: ruby symlink

我支持适用于OS X和Linux的跨平台ruby 2脚本,但在Windows尝试删除包含目录符号链接的树时失败。这是我在最简单的可能示例中看到的,从irb运行。目录" parent"包含一个名为"符号链接"的符号链接指向目标目录。目标存在。

irb(main):001:0> require 'fileutils'
=> true
irb(main):003:0> FileUtils.rm_r 'parent'
Errno::ENOENT: No such file or directory - parent/symlink
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1349:in `open'
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1349:in `entries'
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1349:in `entries'
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1536:in `postorder_traverse'
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1537:in `block in postorder_traverse'
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1536:in `each'
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1536:in `postorder_traverse'
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:837:in `remove_entry'
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:695:in `block in rm_r'
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:691:in `each'
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:691:in `rm_r'

system('rmdir /s/q parent')之类的解决方案外,还有其他选择吗?我知道在Windows上不支持FileUtils.symlink(),但FileUtils.rm_r()的核心故障完全不同。这是一个问题,因为Win 7问世,甚至可能回到Vista,我还没有找到一个好的解决方案,不会涉及到CMD.EXE。

注意:FileUtils.rm_rf()并没有改进。

1 个答案:

答案 0 :(得分:1)

我已经阅读了ruby 2.0中fileutils.rb的源代码,以及它所依赖的代码。从这个来源可以清楚地看到,不考虑Windows符号链接,尽管Win32的代码行为与整个模块中的非Windows行为不同。关于Windows符号链接的Ruby似乎没有任何打开的门票,所以答案是,Ruby不处理它,它看起来不会很快。因此,system('rmdir /s/q parent')解决方法是删除包含符号链接的Windows目录树的方法。