Issue #6587 has been reported by usa (Usaku NAKAMURA).
Feature #6587: proposal: adding new methods File.rootname and
Pathname#rootname
Author: usa (Usaku NAKAMURA)
Status: Open
Priority: Normal
Assignee:
Category:
Target version: 2.0.0
みんな大好き 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)) と同じです。