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

> On 3月30日, 上午9时21分, "Bret Pettichord" <bpettich... / gmail.com>  
> wrote:
>> 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
>
> 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. ;-)

-Rob

Rob Biedenharn		http://agileconsultingllc.com
Rob / AgileConsultingLLC.com