`dirname' を書いてみた
File クラスに入ってるけど、書いてみた。
ルールはこんな感じ。
- path の一番後ろのスラッシュより前を返すこと
- スラッシュを含まないファイル名に対しては "." を返すこと
- 先頭が "./" なファイル名に対しても "." を返すこと
- path が "C:/" のようなときは、path を返す
def dirname(path) directory_levels = path.split( /[\\\/]/ ) if directory_levels.length == 1 then if directory_levels.first =~ /^[A-Z]:/ then return "" end return "." end directory_levels.pop directory_levels.delete_if { |x| x == "" } if directory_levels.length > 1 && directory_levels.first =~ /^(https?|file):/ then directory_levels.first += "/" end return directory_levels.join( "/" ) end
使い方
というか、サンプル。
paths = [ "C:/", "C:/home", "C:/home/alice", "C:/home/alice/foo.txt" ] paths.each do |path| p dirname( path ) end