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/.