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 に答える