bwv549 wrote:
> What is the best idiom for generating a cross-platform basename?
> (i.e., one that will still give the basename of a windows file on
> linux and the basename of a linux file on windows).
>
> filenames = ["C:\\path\\to\\file.txt", "/path/to/file.txt"]
> filenames.all? {|fn|   <some_xpltfrm_basename_idiom>(fn) ==
> "file.txt" }    #  should be true
>
> As I play around with this, it seems that on windows (ruby 1.8.7
> (2010-01-10 patchlevel 249) [i386-mingw32]), File.basename will
> generate the basename on either of the above examples, but on linux
> (ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]) the windows
> basename is not found.  Based on this, I think this may be a fool-
> proof cross-platform idiom for generating the basename:
>
> File.basename( filename.gsub("\\","/") )
>
> This works on windows and linux, at least the versions I'm running.

No it doesn't.  The problem is that there is no easy way to tell what OS
a pathname came from, and each OS's directory separator is a valid
filename character on the other OS.  So you could have a Windows file
called c:\documents\usr/bin/ruby , where usr/bin/ruby is the actual
correct basename.  Your method would fail in this case.

The best advice I can give is this: in your Ruby programs, always use /
as your directory separator internally.  That will work on Windows: the
Ruby interpreter takes care of converting directory separators as
appropriate for the host OS.

>
> Any other/better ideas?  Are there any gotchas with the one I'm using
> above?

Best,
--
Marnen Laibow-Koser
http://www.marnen.org
marnen / marnen.org
--
Posted via http://www.ruby-forum.com/.