0

从当前工作目录中,我试图重命名另一个目录中的文件。我的测试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>

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

4

1 回答 1

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调用前的状态。

于 2013-01-30T08:00:44.027 回答