File :: rename()删除目标文件而不是更改它

时间:2013-01-30 07:57:19

标签: ruby

从当前工作目录我试图重命名另一个目录中的文件。我的测试IRB代码如下:

C:\Documents and Settings\peter>irb
irb(main):001:0> Dir.pwd
=> "C:/Documents and Settings/peter"
irb(main):002:0> File.rename('C:\Documents and Settings\peter\My Documents\userdata\test.txt','a.txt')
=> 0
irb(main):003:0>File.exist?('C:\Documents and Settings\peter\My Documents\userdata\test.txt')
=> false
irb(main):004:0>File.exist?('C:\Documents and Settings\peter\My Documents\userdata\a.txt')
=> false
irb(main):005:0>

而不是重命名目标文件是从文件系统中删除 - 为什么呢?如果不是重命名文件的正确方法,请告诉我一个安全的方法。但我无法更改当前工作目录以进行重命名,并重命名是否需要更改当前目录,重命名后我想要返回上一个当前工作目录。

1 个答案:

答案 0 :(得分:4)

首先,你不应该在这里使用反斜杠。原因是反斜杠是一个转义序列启动器,因此下次可能会得到非常意外的结果(例如,如果你不小心在双引号字符串中使用反斜杠)。在这种情况下没有问题,但这是一个愚蠢的运气。始终在文件路径中使用正斜杠。 上的应处理它们。

其次,你在找错了地方。重命名的文件应出现在

C:/Documents and Settings/peter/a.txt

因为这是你目前正在工作的目录。如果您希望它出现在“C:/ Documents and Settings / peter / My Documents / userdata”中,请在重命名之前更改工作目录,或指定完整的目标文件路径。

File.rename('C:/Documents and Settings/peter/My Documents/userdata/test.txt',
            'C:/Documents and Settings/peter/My Documents/userdata/a.txt')

您还可以使用Dir::chdir的块。

Dir.chdir('C:/Documents and Settings/peter/My Documents/userdata') do
  File.rename('test.txt', 'a.txt')
end

在块返回后,工作目录将恢复到chdir调用之前的状态。