Feature #6587
Updated by nobu (Nobuyoshi Nakada) over 12 years ago
=begin みんな大好き Unixen ではパスの先頭は '/' で始まるものという暗黙の前提がありますが、Windows ではドライブレターおよび UNC というものがあるのでその前提が成り立たないことは広く知られていると思います。 Ruby はドライブレターや UNC はそれなりに適切に取り扱うようになっていますが、残念ながらパス名を処理する際には依然としてロジックを自前で用意する必要があります。 例えば ruby 配布物の test/ 以下を見ると、独自にドライブレター周りを扱おうとしているコードが散見されますが、それぞれ異なる処理を書いており、UNC や拡張パス名(という名前でいいかどうかわかりませんが、"//?/" あるいは "//./" で始まるもの)まで含めて適切に取り扱えているコードはほぼありません。 そこで、(({dirname}))、(({basename}))、(({extname})) などから類推して、(({rootname})) そこで、dirname、basename、extname などから類推して、rootname というメソッドを (({File})) File の特異メソッドおよび (({Pathname})) Pathname のメソッドとして追加することを提案します。 --- : File.rootname(filename) -> String filename のうち、ルートディレクトリあるいはそれに相当する部分を文字列として返します。 filename が相対パスなどの場合は ""(空文字列)を返します。 # on Unixen p File.rootname("/foo/bar.txt") #=> "/" (absolute path) p File.rootname("bar.txt") #=> "" (relative path) # on Windows p File.rootname("/foo/bar.txt") #=> "" (relative path) p File.rootname("bar.txt") #=> "" (relative path) p File.rootname("C:/foo/bar.txt") #=> "C:/" (normal absolute path) p File.rootname("C:bar.txt") #=> "" (relative path) p File.rootname("//host/share/baz.txt") #=> "//host/share" (UNC absolute path) p File.rootname("//?/C:/foo/bar.txt") #=> "//?/C:/" (extended form absolute path) --- : Pathname#rootname Pathname.new(File.rootname(self.to_s)) と同じです。 =end