在Windows上,Ruby FileUtils.move出现Errno :: EACCES:权限被拒绝

4

你如何在Windows上使用Ruby移动文件?查看文档,似乎可以使用FileUtils.move。但是,在Windows 10上,这对我来说不起作用。

irb(main):001:0> RUBY_VERSION
=> "2.3.0"
irb(main):002:0> require 'fileutils'
=> true
irb(main):003:0> FileUtils.mkdir("first_directory")
=> ["first_directory"]
irb(main):004:0> FileUtils.mkdir("second_directory")
=> ["second_directory"]
irb(main):005:0> FileUtils.touch(File.join("first_directory", "test_file"))
=> ["first_directory/test_file"]
irb(main):006:0> file = File.new(File.join("first_directory", "test_file"))
=> #<File:first_directory/test_file>
irb(main):007:0> FileUtils.move(file, "second_directory")
Errno::EACCES: Permission denied @ rb_file_s_rename - (first_directory/test_file, second_directory/test_file)
        from C:/ruby/23-x64/lib/ruby/2.3.0/fileutils.rb:528:in `rename'
        from C:/ruby/23-x64/lib/ruby/2.3.0/fileutils.rb:528:in `block in mv'
        from C:/ruby/23-x64/lib/ruby/2.3.0/fileutils.rb:1571:in `block in fu_each_src_dest'
        from C:/ruby/23-x64/lib/ruby/2.3.0/fileutils.rb:1585:in `fu_each_src_dest0'
        from C:/ruby/23-x64/lib/ruby/2.3.0/fileutils.rb:1569:in `fu_each_src_dest'
        from C:/ruby/23-x64/lib/ruby/2.3.0/fileutils.rb:517:in `mv'
        from (irb):5
        from C:/ruby/23-x64/bin/irb.cmd:19:in `<main>'

这是已知的限制吗?还是bug?或者是我做错了什么?Google搜索结果显示chmod适用于Linux系统,但我认为在Windows系统(无论是否以管理员身份运行脚本)中并不相关。

1个回答

4
原来问题出在file = File.new(File.join("first_directory", "test_file"))这一行上。实际上这个操作是打开文件,这样就会阻塞重命名操作(移动操作是通过重命名实现的),因为文件目前正在使用中。删除此行并且在FileUtils.move中使用文件路径而不是对象就能正常工作。
同样地,在资源管理器中创建文件对象,然后尝试重命名文件也会发现类似的问题:The action can't be completed because the file is open in ruby.exe...

1
我曾经遇到过一个非常相似的问题,文件是通过Tempfile.open打开的,我必须使用.close确保该文件可以被重命名和移动。感谢您的提示! - janpio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接