Why does File.join use "/" on Windows?

I just had to work on some code that ran into trouble, because Ruby
uses “/” to separate folders, but the path was being passed to a
separate command (using system) that expected Window’s paths to use
“”.

C:\Users\bret>irb
irb(main):001:0> File.join “foo”, “bar”
=> “foo/bar”
irb(main):002:0>

I told my collegues that instead of using File.join, they should just
use + “\” +
But this got me to wondering what the point of File.join was if you
couldn’t trust it to construct paths correctly (unless you were sure
that the path was only going to be used by other ruby commands).

Is there a rationale? Is there a different library that i should be
using instead?

bret

On 3ÔÂ30ÈÕ, ÉÏÎç9ʱ21·Ö, “Bret P.” [email protected] wrote:

I told my collegues that instead of using File.join, they should just
use + “\” +
But this got me to wondering what the point of File.join was if you
couldn’t trust it to construct paths correctly (unless you were sure
that the path was only going to be used by other ruby commands).

Is there a rationale? Is there a different library that i should be
using instead?

bret

Windows NT support ‘/’ but not win98 or DOS.

On Mar 29, 2007, at 10:35 PM, Wang Dong wrote:

irb(main):002:0>
bret

Windows NT support ‘/’ but not win98 or DOS.

You could try something like this (note UNTESTED since I’m only on
Unixes):

class File
def to_s expand=false
(expand ? File.expand_path(path) : path).gsub(‘/’, SEPARATOR)
end
end

Used then like this:

File.new(‘/tmp/foo’,‘w’).to_s(true)
=> “/tmp/foo”
File.new(‘/tmp/…/tmp/./foo’,‘w’).to_s(true)
=> “/tmp/foo”
File.new(‘/tmp/…/tmp/./foo’,‘w’).to_s
=> “/tmp/…/tmp/./foo”

Or presumably on Windows:

File.new(File.join(‘foo’,‘bar’),‘w’).to_s(true)
=> “C:\Users\bret\foo\bar”
File.new(File.join(‘foo’,‘bar’),‘w’).to_s
=> “foo\bar”

You could also define a String#as_file to do the same .gsub
(‘/’, ::File::SEPARATOR)

If Microsoft hadn’t broken the path separator in the first place,
they wouldn’t have had to fix it. :wink:

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

On 30.03.2007 03:21, Bret P. wrote:

I told my collegues that instead of using File.join, they should just
use + “\” +

I’d probably rather use [“foo”, “bar”].join File::SEPARATOR (if that’s
set to \ on Windows).

But this got me to wondering what the point of File.join was if you
couldn’t trust it to construct paths correctly (unless you were sure
that the path was only going to be used by other ruby commands).

Exactly. File.join produces paths that Ruby can correctly use. That’s
the rationale.

Is there a rationale? Is there a different library that i should be
using instead?

Well, you could do path.tr ‘/’, ‘\’ before passing the path to some
other process.

Kind regards

robert

Wang Dong wrote:

Windows NT support ‘/’ but not win98 or DOS.

No, Windows and DOS have always supported ‘/’. But some programs (in
particular, COMMAND.COM and CMD.EXE) have a problem because of an
ancient need to be compatible with DOS 1.0.

On Mar 30, 3:07 pm, Robert K. [email protected] wrote:

irb(main):002:0>

I told my collegues that instead of using File.join, they should just
use + “\” +

I’d probably rather use [“foo”, “bar”].join File::SEPARATOR (if that’s
set to \ on Windows).

Wuby always uses backslashes. :slight_smile:

Regards,

Dan

On 3/30/07, Robert K. [email protected] wrote:

I’d probably rather use [“foo”, “bar”].join File::SEPARATOR (if that’s
set to \ on Windows).

File::SEPARATOR is set to ‘/’ on all platforms:

C:>ruby -v
ruby 1.8.5 (2006-08-25) [i386-mswin32]

C:>irb
irb(main):001:0> File::SEPARATOR
=> “/”
irb(main):002:0> File::Separator
=> “/”

Best regards,

Wayne


Wayne V.
No Bugs Software
Ruby, Erlang and C# Agile Contract Programming in Silicon Valley

On 4/2/07, Daniel B. [email protected] wrote:

Wuby always uses backslashes. :slight_smile:
\T\h\e\n\ \/\/\o\u\l\d\n'\t it be \/\/\u\b\y

Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/