From: "K.Umakoshi" Date: 2001-08-23T22:21:33+09:00 Subject: [ruby-list:31095] Re: File#join From: nobu.nakada@nifty.ne.jp Subject: [ruby-list:31085] Re: File#join Date: Thu, 23 Aug 2001 11:47:42 +0900 Message-Id: <200108230247.f7N2lVO28767@sharui.nakada.kanuma.tochigi.jp> /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > At Wed, 22 Aug 2001 23:21:23 +0900, > K.Umakoshi wrote: > > class FileName < String > > PF_UNIX = 0 > >  Socket::PF_UNIXと紛らわしくないでしょうか。 単に platform を略して PF としたんですが…、 Socket::PF_UNIX の存在は知りませんでした。 > それにこうやって場 > 合分けをするよりも、Unix用、Windows用、DOS用のクラスにしたいよ > うな気も。 そうですね。 対応プラットフォームが増えるとわかり難くなりそうでし、 別のプラットフォーム用のファイル名を扱うのが容易そうですね。 > > PLATFORM = PF_DOS > > Separator = '\\' > > Separators = Separator > >  DOSでもシステムコールレベルでは'/'も有効だったと思います。そ そうなんですか。知りませんでした。 # DOS の確認環境がないのではずそうかな… > れにFile::SEPARATOR, File::ALT_SEPARATORという定数が既に用意さ > れているので、そっちを使ったほうが面倒が少なそうです。もしくは > 上記のようにプラットフォーム別のクラスにするなら、それぞれの定 > 数にするか。 File::SEPARATOR の存在は知っていたのですが、 cygwin で時々 windiff //c/hoge //d/hoge 等とやって叱られる私は、 Windows でも '/' なのが気に入らなかったのです。(^^; > > [3 TestFileName.rb ] > (snip) > > s1 = FileName.new('a') > > s2 = FileName.new('A') > > assert(s1.icasecmp(s2) == 0) > >  すいません、これって正しいんでしょうか。 仕様は、少なくとも Windows NT/2000 では正しいです。 # が、FileName#icasecmp の方が実装できてないので、 # このテストケースは失敗します。 ## あ、TestFileName#test_clean がバグッてる… DOS, Windows 95/98/Me ではどうなのか知りません。 > class File > class Name < String (省略) > class DOS < Name (省略) > def <=>(name) > clean.upcase <=> type.clean(name).upcase > end 確かめずに upcase にしてたんですが、 実際 Windows 2000 でファイルを作ってソートしてみたら '-' < '@' < '[' < '_' < '1' < 'A' となったので、 Windows NT/2000 では downcase の方が近いみたいです。 しかし、完全に同じにするには Unicode で比較しないとダメかも…。 ---- 馬越