2011-08-24 331 views
13

我想写一个在windows和linux下工作的应用程序。但我有一个路径问题,因为Windows使用“\”和Linux使用“/”。我可以解决这个问题。 感谢Ruby中的斜杠和反斜杠

回答

17

在Ruby中,有在Linux或Windows路径之间没有什么区别。不管环境如何,路径应该使用/。因此,要在Windows中使用任何路径,请将所有\替换为/File#join将适用于Windows和Linux。例如,在Windows中:

Dir.pwd 
=> "C/Documents and Settings/Users/prince" 

File.open(Dir.pwd + "/Desktop/file.txt", "r") 
=> #<File...> 

File.open(File.join(Dir.pwd, "Desktop", "file.txt"), "r") 
=> #<File...> 

File.join(Dir.pwd, "Desktop", "file.txt") 
=> "C/Documents and Settings/Users/prince/Desktop/file.txt" 
+2

哦,如果这只在你想运行外部命令时才起作用。 – Automatico

+0

...不正确,在窗口中有特殊的前缀,比如\\?\(路径需要> 260bytes),它被转换为//?/根本没有任何意义......所以这个特性确实是一个bug代码 – estani

+0

@estani我没有说这是一个功能。我说'File.join'事实上所有路径都由'/'分隔,无论环境如何。这就是如何在ruby中表示路径,并且在初始化文件时,即使在Windows的情况下也需要使用'/'作为文件路径。 – rubyprince

7

使用Pathname类来生成,然后将是正确的您的系统上的路径:

a_path = Pathname.new("a_path_goes_here") 

这样做的好处是,它可以让你链目录由使用+操作:

a_path + "another_path" + "and another" 

调用然后a_path.to_s会为你是在系统的正确路径。

+2

不要忘记需要“路径名”,除非你运行在一个巨大的web开发框架上。 –

+0

这不适用于Windows 2.0上的Ruby 2.0.0,除非我丢失了一些东西: p = Pathname.new(“”) p = p +“apple”+“banana” puts p.to_s < - “apple/banana” –

+0

改为使用File.join,它比路径名更简单,也更少烦人 - 它会工作得很好。 – shevy

6

只要红宝石做的工作,/路径名是在Windows

一次OK,你必须发送路径一些其他程序使用,特别是在命令行或类似文件上传的东西在浏览器中,您必须在Windows中运行时将斜杠转换为反斜杠。

C:/projects/a_project/some_file.rb'.gsub('/', '\\')作品魅力。 (这应该是一个双反斜杠 - 这个编辑器甚至在单引号中认为它是一种逃避)。

在将路径名字符串发送出Ruby控件之前,使用类似的方法。

您将必须确保您的程序知道它正在运行的操作系统,以便它可以决定何时需要此操作系统。一种方法是在程序运行开始时设定一定的,像这样

::USING_WINDOWS = !!((RUBY_PLATFORM =~ /(win|w)(32|64)$/) || (RUBY_PLATFORM=~ /mswin|mingw/))

(我知道这工作,但我没写,所以我不明白的双重爆炸.. )

+2

我相信'!!'将它转换为布尔值。在ruby中,true通常作为非零或非错误对象返回(您会在您的案例中获得一个Match对象)。 '!'将对象转换为'false',第二个'!'将它转换为'true'。 –

0

是的,它很烦人,因为windows用户不断将这些反斜杠替换为斜杠,反之亦然,如果您需要将路径复制到您的文件管理器,那么我就像他一样。 如果你在Linux或Mac上,它并没有什么坏处,并且可以在Windows中节省大量的麻烦。

path = 'I:\ebooks\dutch\_verdelen\Komma'.gsub(/\\/,'/') 

Dir.glob("#{path}/**/*.epub").each do |file| 
    puts file 
end