`dirname' を書いてみた

File クラスに入ってるけど、書いてみた。
ルールはこんな感じ。

  1. path の一番後ろのスラッシュより前を返すこと
  2. スラッシュを含まないファイル名に対しては "." を返すこと
  3. 先頭が "./" なファイル名に対しても "." を返すこと
  4. 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