Ruby中斜杠和反斜杠的用法

18

我想编写一个可以在Windows和Linux上运行的应用程序,但是我遇到了路径问题,因为Windows使用“\”而Linux使用“/”。如何解决这个问题。 谢谢

(注:保留原文中的HTML标签)
5个回答

22

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"

4
哦,如果这仅在您想运行外部命令时有效。 - Automatico
2
不是真的,在Windows中有特殊的前缀,如\?\(对于路径> 260字节是必需的),它们会转换为//?/,这根本没有意义...因此,我认为该功能实际上是一个错误。 - estani
@estani 我并没有说这是一个特性。我说的是 File.join,实际上所有路径都使用 / 分隔,无论环境如何。这就是 Ruby 中表示路径的方式,即使在 Windows 系统中初始化文件时,也必须使用 / 来表示文件路径。 - rubyprince
@rubyprince 你说得对。虽然join使用了一个分隔符常量,但硬编码为*/*...来自file.c separator = rb_obj_freeze(rb_usascii_str_new2("/")); 这太错误了... - estani
在Windows上,我必须将冒号添加到“c”路径中:"C:/Documents and Settings/Users/prince/Desktop/file.txt" - P.Brian.Mackey
我认为estani的上述评论可能已经不再正确了;如果我没记错,现在Ruby在Windows上使用一些动态检查(在Linux上我们甚至不需要它,因为Linux无论如何都比Windows优越)。但我不是100%确定,也许有人可以确认一下。 - shevy

13
只要 Ruby 在工作,Windows 上路径名称中的斜杠 / 是可以接受的。但一旦你需要向其他程序发送路径(特别是在命令行或浏览器文件上传等情况下),就必须在 Windows 中将斜杠转换为反斜杠。例如:C:/projects/a_project/some_file.rb'.gsub('/', '\\')。请在将字符串发送到 Ruby 控制以外的地方之前执行此操作,并确保程序了解自己运行的操作系统,以便决定何时需要进行此操作。一个方法是在程序运行开始时设置一个常量:::USING_WINDOWS = !!((RUBY_PLATFORM =~ /(win|w)(32|64)$/) || (RUBY_PLATFORM=~ /mswin|mingw/))

3
我相信 !! 将其转换为布尔值。在 Ruby 中,true 通常返回为非 nil 或非 false 的对象(在您的情况下,您将获得一个匹配对象)。! 将对象转换为 false,第二个 ! 将其转换为 true - Mr_Moneybags

10

似乎“join”方法是针对Linux的。我该如何在Windows上使用join方法? - amir amir
根据您的平台,“File.join”将使用\或/作为分隔符。 - Wukerplank
13
实际上,File.join 在 Windows 上也使用 / - dubek

6

使用Pathname类生成路径,使其在您的系统上正确:

a_path = Pathname.new("a_path_goes_here")

这样做的好处是可以使用+运算符链接目录:

a_path + "another_path" + "and another"

调用a_path.to_s将会生成适合你所在系统的正确路径。

2
除非您正在运行庞大的Web开发框架,否则请不要忘记使用“pathname”。 - Andrew Grimm
1
除非我漏掉了什么,否则这在Windows上的Ruby 2.0.0中无法工作: p = Pathname.new("") p = p + "apple" + "banana" puts p.to_s <-- "apple/banana" - Ed Norris
使用File.join代替pathname会更简单、更方便,而且同样有效。 - shevy
@shevy 【需要引用来源】。为什么它会“不那么烦人”? - Ryan Bigg
我也认为File.join即使在Windows机器上仍然会使用/。而Pathname则会使用操作系统所指定的符号。 - Ryan Bigg
无论是路径名还是文件连接都将使用/。底层的Ruby会根据操作系统自动处理/ - Sunny

0
是的,作为Windows用户,如果您需要将路径复制到文件管理器中,反斜杠和正斜杠之间来回转换很麻烦,所以我像他一样做。 在Linux或Mac上使用也没有问题,可以避免很多麻烦。
path = 'I:\ebooks\dutch\_verdelen\Komma'.gsub(/\\/,'/')

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接