Dir#chdir()虚拟地改变了目录吗?

时间:2013-01-29 14:45:35

标签: ruby

我有实际的目录路径:C:\Documents and Settings\Matt\现在我在这里尝试了Dir::chdir(),看看它是如何工作的。

C:\Documents and Settings\Matt>cd..

C:\Documents and Settings>cd..

C:\>irb
irb(main):001:0> Dir.pwd
=> "C:/"
irb(main):002:0> Dir.chdir('\Documents and Settings')
=> 0
irb(main):003:0> Dir.pwd
=> "C:/Documents and Settings"

现在下面为什么会出现错误,而之前的pwd显示当前目录已更改 如"C:\Documents and Settings"

irb(main):004:0> Dir.chdir('\Matt')
Errno::ENOENT: No such file or directory - \Matt
        from (irb):4:in `chdir'
        from (irb):4
        from C:/Ruby193/bin/irb:12:in `<main>'

但低于它的作用 - 这是否意味着chdir没有将目录更改为"C:\Documents and Settings"?我使用C:\时来自Dir.chdir('\Documents and Settings')

irb(main):005:0> Dir.chdir('\Documents and Settings\Matt')
=> 0
irb(main):006:0> Dir.pwd
=> "C:/Documents and Settings/Matt"
irb(main):007:0>

1 个答案:

答案 0 :(得分:4)

它改变了正在运行的程序的工作目录,而不是虚拟的。 (但从物理上讲,退出时,提示符将显示不同的目录)

但是前面的反斜杠指的是文件系统的根。

\Matt,在开头有一个反斜杠,指的是文件系统的 root 上名为Matt的目录,如C:\Matt中所示。那不存在。您想要相对于Documents and Settings更改目录,因此请不要使用反斜杠。

Dir.pwd
=> "C:/"

Dir.chdir('\Documents and Settings')
# Matt is inside Documents and Settings, not at the root \
Dir.chdir('Matt')
# Or use .\ to refer to the current directory
Dir.chdir('.\Matt')
# Even better, use File.join to supply the correct separator, which makes this platform-independent
Dir.chdir(File.join('.','Matt'))

如果你这样做:

Dir.chdir('\Matt')

...它会尝试更改为不存在的C:\Matt