From: "matz (Yukihiro Matsumoto)" Date: 2012-07-17T11:10:19+09:00 Subject: [ruby-dev:45968] [ruby-trunk - Feature #6587][Rejected] proposal: adding new methods File.rootname and Pathname#rootname Issue #6587 has been updated by matz (Yukihiro Matsumoto). Status changed from Assigned to Rejected ---------------------------------------- Feature #6587: proposal: adding new methods File.rootname and Pathname#rootname https://bugs.ruby-lang.org/issues/6587#change-28166 Author: usa (Usaku NAKAMURA) Status: Rejected Priority: Normal Assignee: matz (Yukihiro Matsumoto) Category: core Target version: 2.0.0 =begin みんな大好き Unixen ではパスの先頭は '/' で始まるものという暗黙の前提がありますが、Windows ではドライブレターおよび UNC というものがあるのでその前提が成り立たないことは広く知られていると思います。 Ruby はドライブレターや UNC はそれなりに適切に取り扱うようになっていますが、残念ながらパス名を処理する際には依然としてロジックを自前で用意する必要があります。 例えば ruby 配布物の test/ 以下を見ると、独自にドライブレター周りを扱おうとしているコードが散見されますが、それぞれ異なる処理を書いており、UNC や拡張パス名(という名前でいいかどうかわかりませんが、"//?/" あるいは "//./" で始まるもの)まで含めて適切に取り扱えているコードはほぼありません。 そこで、(({dirname}))、(({basename}))、(({extname})) などから類推して、(({rootname})) というメソッドを (({File})) の特異メソッドおよび (({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 -- http://bugs.ruby-lang.org/