FrontPage  Index  Search  Changes  RSS  wikifarm  Login

File_split3.rb

概要

パスをディレクトリ名とファイル名と拡張子に3分割します。3個の文字列を要素とする配列を返します。

ruby標準の File.split とは異なり、全く形式的に分割します。

  1. 常に3個の文字列の配列を返します。nil を返すことはありません。
  2. ディレクトリ名があれば、ディレクトリ名の最後に「/」が付ます。ディレクトリ名がない場合には空文字列を返します。
  3. 拡張子には、最初に「.」が付ます。なければ空文字列を返します。
  4. 従って、通常は、それをそのまま結合すれば元の文字列に戻ります。
  5. ただし、次のような場合には元には戻りません。
    1. (1)「\」がセパレータとして使われている場合には「/」に変換される。
    2. (2)元の文字列の前後の空白は削除される。
    3. (3)また、パスの最初が「"」または「'」で始まる場合には、String#split('"')で分解した1番目の要素に限定する。

* Ruby 標準装備の File.dirname や File.split は Ruby のバージョンによって仕様が異なるので要注意ですぞ。


依存性

  1. Linux でも Windowsでもつかえます。
  2. File_unix.rb

利用者


実行見本:

1.jpg

コメントがありましたらどうぞ

(comment plugin is disabled).

説明

1. Ruby 標準の File::split との違い

Ruby 標準の File::split と比べると、

  1. split3 は「ディレクトリ」と「ファイル名」と「拡張子」の3個に分離する、
  2. split は「ディレクトリ」と「拡張子付きのファイル名」の2個に分離する、
  3. という大きな違いがある。

それ以外にも微妙な違いがある。

1.1. 「"」または空白の扱い

パスの前後に空白がある場合には最初に String#strip で取り去る。

require "File_split3"

#-- パスの前後に空白がある場合
#-- split3では取り去る。
#-- split では残る。

p File.split3("  G:/html files/index.html  ")
p File.split( "  G:/html files/index.html  ")

#=> ["G:/html files/",  "index", ".html"]
#=> ["  G:/html files", "index.html  "  ]

パスの最初が「"」または「'」で始まる場合には、String#split('"')で分解した1番目の要素に限定する。

#-- パスの前後に「'」か「"」がある場合
#-- split3では取り去る。
#-- split では残る。

p File.split3(" 'G:/html files/index.html' ")
p File.split( " 'G:/html files/index.html' ")

#=> ["G:/html files/",  "index", ".html"]
#=> [" 'G:/html files", "index.html' "]

「"」「'」で囲まれた中に前後の空白がある場合には、パスの前後の空白であっても取り去らない。

#-- パスの前後に「'」か「"」がありその中のパスの前後に空白がある場合
#-- split3では空白が残る。
#-- split では「'」も含めて残る。

p File.split3('" G:/html files/index.html "')
p File.split( '" G:/html files/index.html "')

#=> [" G:/html files/",  "index", ".html "]
#=> ["\" G:/html files", "index.html \""  ]

1.1. 「\」セパレータの扱い。

  1. File::split3 では「\」は常に「/」に変換する。
  2. File::split(1.6)は「\」に対応していなかった。
  3. File::split(1.8)は「\」に対応している。「\」のままで返す。
require "File_split3"

#-- 「\」セパレータは
#-- split3では「/」に変換する。
#-- split (1.6):未対応。
#-- split (1.8):「\」のままで分割。

p File.split3('c:\dir\index.html')
p File.split( 'c:\dir\index.html')
p File.split( 'c:\dir\index.html')

#=> ["c:/dir/", "index", ".html"     ]
#=> [".",       "c:\\dir\\index.html"] # 1.6
#=> ["c:\\dir", "index.html"         ] # 1.8

1.1. フルパスの全部がそろっている場合

  1. File::split3 では「/」を付けたままで返す。
  2. File::split(1.6)はディレクトリの最後の「/」を削除する。
  3. File::split(1.8)はルートディレクトリでは「/」を残すが、それ以外のディレクトリでは最後の「/」を削除する。
require "File_split3"

#-- フルパス形式(全部そろっている場合)
#-- split3:ディレクトリの最後の「/」は残す。
#-- split :ディレクトリの最後の「/」は取り去る。

p File.split3("G:/HTM/index.html")
p File.split( "G:/HTM/index.html")

#=> ["G:/HTM/", "index", ".html"]
#=> ["G:/HTM",  "index.html"    ]

#-- ルートディレクトリの場合
#-- split3:ディレクトリの最後の「/」は残す。
#-- split (1.6):ディレクトリの最後の「/」は取り去る。
#-- split (1.8):ディレクトリの最後の「/」を残す。

p File.split3('c:/index.html')
p File.split( 'c:/index.html')
p File.split( 'c:/index.html')

#=> ["c:/", "index", ".html"] #
#=> ["c:",  "index.html"]     # 1.6
#=> ["c:/", "index.html"]     # 1.8

* File.split@1.6 ではルートディレクトリのときに相対パスと絶対パスとの区別が出来ない。

* File.split@1.8 では通常は「/」が削除されるのに、ルートディレクトリのときだけ残るので、分解した後に場合分けが必要になる。

1.1. ディレクトリ部分がない場合

  1. File::split3 では「""」を返す。
  2. File::split ではディレクトリが見当たらない場合には「.」を返す。
require "File_split3"

#-- ディレクトリがない場合
#-- split3:「""」 を返す。
#-- split :「"."」を返す。

p File.split3("index.html")
p File.split( "index.html")

#=> ["",  "index", ".html"]
#=> [".", "index.html"    ]

p File.split3('c:index.html')
p File.split( 'c:index.html')

#=> ["c:",  "index", ".html"]
#=> ["c:.", "index.html"]

1.1. ファイル名部分がない場合(「/」で終わっている場合)。

  1. split3:ディレクトリとみなす。
  2. split@1.6:ディレクトリとみなす。
  3. split@1.8:名前として抽出する。
require "File_split3"

#-- ファイル名がない場合(「/」で終わっている場合)
#-- split3:ディレクトリとみなす。
#-- split (1.6):ディレクトリとみなす。
#-- split (1.8):名前として抽出する。

p File.split3("G:/HTM/")
p File.split( "G:/HTM/")
p File.split( "G:/HTM/")

#=> ["G:/HTM/", "", ""]
#=> ["G:/HTM",  ""    ] # ver 1.6
#=> ["G:/",     "HTM" ] # ver 1.8

1.1. それ以外は同じ。

以上の違いは、要するに、 File::split3 では単純に文字列のパターンを形式的に判断して分割する、と一言でいうことができる。

その性質から来る違いを除けば同じ。

require "File_split3"

#-- 以上を除けば File::split と同じ。

#-- 「.」が含まれていなければ「""」を拡張子として返す。
#-- 「.」で終わっていれば「.」を拡張子として返す。
#-- 「.」が2個以上ある場合には最後の「.」より後を拡張子として返す。

p File.split3("G:/HTM/index")
p File.split3("G:/HTM/index.")
p File.split3("G:/HTM/index.html.bak")

#=> ["G:/HTM/", "index", ""]
#=> ["G:/HTM/", "index", "."]
#=> ["G:/HTM/", "index.html", ".bak"]

#-- 「*」などの記号でも可。

p File.split3("G:/HTM/*.html")
p File.split3("G:/HTM/*.")

#=> ["G:/HTM/", "*", ".html"]
#=> ["G:/HTM/", "*", "."]

ソース:

File_split3.rb

#! ruby -Ks
#-- File_split3.rb
#-- ../doc/lib/File_split3.pi

require "File_unix"

#-- returns array of [ dir , basename , ext ]

class File
  def self.split3(path)
    path = self.unix path.strip
    path = path.split('"')[1] if path[0] == ?"
    path = path.split("'")[1] if path[0] == ?'
    case path
    #
    # 2005-10-12(水)
    # path = "C:/Program Files/Apollo/lib/ruby/1.8/1" に対応。「/」以外にマッチ /・・[^\/]・・/
    #
    when /^(.*\/)(.*)(\.[^\/]*?)$/ ; return [ $1 , $2, $3]
    when /^(.*\/)(.*)$/            ; return [ $1 , $2, ""]
    when /^(.*\:)(.*)(\..*?)$/     ; return [ $1 , $2, $3]
    when /^(.*\:)(.*)$/            ; return [ $1 , $2, ""]
    when /^(.*)(\..*?)$/           ; return [ "" , $1, $2]
    else                           ; return [ "" , path , ""]
    end
  end
end

Last modified:2006/06/26 14:32:17
Keyword(s):
References:[File_unix.rb]