当有指向目录的符号链接时,Ruby FileUtils.rm_r 在 Windows 上失败:替代方案?

问题描述 投票:0回答:1

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

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')
这样的解决方案之外,这里还有其他选择吗?我知道 FileUtils.symlink() 在 Windows 上不受支持,但 FileUtils.rm_r() 的核心故障完全是另一回事。自从 Win 7 出现以来,这一直是一个问题,甚至可能回到 Vista,我还没有找到一个不涉及炮击到 CMD.EXE 的好解决方案。

注意:FileUtils.rm_rf() 不会改进。

ruby symlink
1个回答
1
投票

2023 更新: 这不再是事实。自 2015 年以来的某个时候,Ruby 已得到修复,因此此限制消失了。

我之前的回答,为了后代:

我已经阅读了 ruby 2.0 中 fileutils.rb 的源代码,以及它所依赖的代码。从这个来源中可以清楚地看出,没有考虑 Windows 符号链接,尽管在这个模块中,Win32 的代码与非 Windows 的行为不同。似乎没有任何关于 Windows 符号链接的 Ruby 公开票证,所以答案是,Ruby 不处理它,而且看起来不会很快处理。所以

system('rmdir /s/q parent')
解决方法是删除包含符号链接的 Windows 目录树的方法。

© www.soinside.com 2019 - 2024. All rights reserved.