我不是Ruby人,但我被分配来修改我们的构建脚本。该脚本试图移动(重命名)文件,但我不确定为什么我会收到错误。我添加了:force => true
我认为如果存在则会覆盖该文件。我在OSX上运行这个脚本。
FileUtils.mv(var1, var2, {:force => true, :verbose => true})
结果:
ERROR -- : same file: filename1.txt and Filename1.txt
ERROR -- : ["/opt/local/lib/ruby/1.8/fileutils.rb:1396:in `fu_each_src_dest'",
"/opt/local/lib/ruby/1.8/fileutils.rb:1413:in `fu_each_src_dest0'",
"/opt/local/lib/ruby/1.8/fileutils.rb:1395:in `fu_each_src_dest'",
"/opt/local/lib/ruby/1.8/fileutils.rb:495:in `mv'"
所以我做了一些挖掘,发现了这个错误被抛出的地方:
# File lib/fileutils.rb, line 1512
def fu_each_src_dest(src, dest) #:nodoc:
fu_each_src_dest0(src, dest) do |s, d|
raise ArgumentError, "same file: #{s} and #{d}" if fu_same?(s, d)
yield s, d, File.stat(s)
end
end
当ArgumentError
返回true时,此行是否抛出if fu_same?(s, d)
?或者这是否相反?
更新 问题是文件系统不区分大小写,因此它将两个文件名视为“相同文件”。另外,OSX文件系统可以设置为区分大小写。
答案 0 :(得分:4)
FileUtils.mv
:force => true
似乎符合您的预期是正确的,但我认为您误读了错误消息。它似乎在告诉您var1 == var2
而var1
应该是现有路径,而var2
应该是(不同的)目的地