Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

slash and backslash in Ruby

Tags:

path

ruby

I want to write a application that works in windows and linux. but I have a path problem because windows use "\" and Linux use "/" .how can I solve this problem. thanks

like image 501
amir amir Avatar asked Aug 24 '11 09:08

amir amir


3 Answers

In Ruby, there is no difference between the paths in Linux or Windows. The path should be using / regardless of environment. So, for using any path in Windows, replace all \ with /. File#join will work for both Windows and Linux. For example, in 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"
like image 159
rubyprince Avatar answered Oct 15 '22 15:10

rubyprince


As long as Ruby is doing the work, / in path names is ok on Windows

Once you have to send a path for some other program to use, especially in a command line or something like a file upload in a browser, you have to convert the slashes to backslashes when running in Windows.

C:/projects/a_project/some_file.rb'.gsub('/', '\\') works a charm. (That is supposed to be a double backslash - this editor sees it as an escape even in single quotes.)

Use something like this just before sending the string for the path name out of Ruby's control.

You will have to make sure your program knows what OS it is running in so it can decide when this is needed. One way is to set a constant at the beginning of the program run, something like this

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

(I know this works but I didn't write it so I don't understand the double bang...)

like image 30
pmneve Avatar answered Oct 15 '22 14:10

pmneve


Take a look at File.join: http://www.ruby-doc.org/core/classes/File.html#M000031

like image 43
Lennaert Avatar answered Oct 15 '22 15:10

Lennaert