From: Kazuhiro Yoshida Date: 2001-08-19T12:42:58+09:00 Subject: [ruby-list:30988] Re: file exist check method? もりきゅうです。 IWATSUKI Hiroyuki wrote: >> assert File.dirname("C:\\"), "C:/" >> assert File.dirname("\\\\server\\share"), "//server" > > 後者は VCL の結果に従ったものと思います。Borland も何か思惑があって > こうなっているのだと思いますが、このままだと不便ですよね。 私も不思議に思っていました。 >> assert File.drivename("C:\\"), "C:" >> assert File.drivename("\\\\server\\share"), "//server/share" この drivename との比較でいけば, > 私としては先頭に \\ があれば \\サーバ名\共有名 という構成を期待しても > 良いのではないかと考えます。つまり後者の結果は "//server/share/" を希 > 望します。 当然そうなるはずなんですよね。そうしよう。 # drivename だけの不完全なディレクトリはそのまま返す。 assert File.dirname("C:"), "C:" assert File.dirname("\\\\server\\share"), "//server/share" # ルートディレクトリは最後の / を残す。 assert File.dirname("C:\\"), "C:/" assert File.dirname("\\\\server\\share\\"), "//server/share/" File.join は def File.join(*args) args.each do |i| i.tr!('\\', '/') case i when %r'^/', %r'^\w:/', %r'^//\w+/\w+/' i.chop! end end args.join(File::SEPARATOR) end このように。 > 今回の話と直接関係ありませんが、Cygwin の bash 上で cd //server は無効 > ですが cd //server/share は有効でした。/share まで含めてディレクトリと > して扱われるように感じました。また、これは //server/ というディレクト > リが存在しないことの現われとも言えます。 > > # ここで Cygwin を引き合いに出すのはよくないでしょうか(汗;)。 いや,ruby-win32 と ruby-cygwin 間にも互換性があるほうが ないよりはよろしいかと。 でも,Cygwin (cygwin-1.1.7-1.tar.gz) では $ cd //c $ cd //c/ は有効ですね。まあ,これは $ cd c:/ $ cd /cygdrive/c/ と同じだから,//c という書き方は obsolete でいいのかも。 assert で書くと win32, cygwin 共通で assert File.dirname("//c"), "//c" assert File.dirname("//c/"), "//c" assert File.dirname("/cygdrive/c/"), "/cygdrive/c" こうかな。現状維持。 DOS prompt の cd c: と cd c:\ は違うのに C:\usr\doc>cd d: D:\ C:\usr\doc>cd c: C:\usr\doc C:\usr\doc> cygwin bash の cd //c と cd //c/ は同じ。 moriq@YOSHIDA ~ $ cd //c/usr/doc moriq@YOSHIDA //c/usr/doc $ cd //d moriq@YOSHIDA //d $ cd //c moriq@YOSHIDA //c $ ややこしい。 ---- YOSHIDA Kazuhiro moriq@moriq.com http://www.moriq.com/