ファイル・ディレクトリ
ここでは、ファイル名およびディレクトリ名なんかを扱うものをメモしていく。
たとえば、あるディレクトリ(フォルダ)にある、すべてのファイルにアクセスしたいときなどは、find モジュールを使う。
標準では使えないので、まず使えるようにする。
require "find"
そして、Find.find(dir) をブロックで使い、指定したディレクトリ以下のすべてのファイルやディレクトリにアクセスする。
コンマで続けて複数のディレクトリを指定することもできる。ディレクトリに "." を指定すると、スクリプトのファイルが含まれる
ディレクトリ(フォルダ)以下のすべてのファイル・ディレクトリ名を一つずつ処理する。
Find.find(".") do |dirname|
処理
end
この処理中に、ディレクトリ(フォルダ)なら処理を飛ばすようにすれば、下層のディレクトリにはアクセスしなくなる。
そのとき使うのは Find.prune。例えば、File.directory?(path) なんかでディレクトリかどうか確認して使う。
Find.find(".") do |dirname|
Find.prune if File.directory?(dirname) && dirname != "."
next if dirname == "."
print dirname + "\n"
end
ここでは、とりあえず、ディレクトリかどうかの確認と同時に、最初に指定したフォルダでないことの確認をして、
さらに最初に指定したフォルダの場合は飛ばしている。これで、最初に指定したフォルダ(スクリプトファイルの入っているフォルダ)に
入っているファイル名が表示されるはず。
File.basename(dir) dir のファイル名部分(最後のスラッシュ以降)を得る
dir の後に、オプションで拡張子を指定すると、それを取り除いた値を返す。".*" だと、すべての拡張子が当てはまる。
fileName = File.basename(dirname,".*")
File.dirname(dir) dir のディレクトリ部分を(最後のスラッシュ以前)得る
directory = File.dirname(dirname)
File.extname(dir) dir の拡張子を得る(ピリオド [.] も含む)
fileExtention = File.extname(dirname)
File.expand_path(dir) dir の絶対パスを得る
fullPath = File.extname(dirname)
以下のものは、File 以外にも FileTest でも同じように使える。ただし、FileTest は include できる(include FileTest)ので、
すっきりさせたい場合はそっちを使うといいかも。
File.directory?(dir) or FileTest.directory?(dir) ディレクトリ(フォルダ)かどうか調べる
File.exist?(dir) or FileTest.exist?(dir) ファイル・ディレクトリが存在するかどうか調べる
File.file?(dir) or FileTest.file?(dir) ファイルかどうか調べる
File.size?(dir) or FileTest.size?(dir) ファイルサイズを得る
上の応用で、拡張子が txt の時だけ表示するようにする。上のに追加されてるのは、File.extname で得た拡張子が .txt にマッチするかどうかを調べてる。
マッチしない場合は次ぎにいく。正規表現では . は任意の一文字になるので \ でエスケープして、$ で文字列末尾である指定をして、さらにオプションに
i を指定して、大文字小文字の区別をしないようにしてる。そして、ファイル名を表示するのではなくて、テキストファイルだった場合は、それを開けて
中身のテキストを表示する。
Find.find(".") do |dirname|
Find.prune if directory?(dirname) && dirname != "."
next if dirname "." || /\.txt$/i !~ File.extname(dirname)
File.open(dirname,"r") do |file|
print file.read + "\n"
end
end
ここにあるものを組み合わせれば、指定したフォルダに入ってる特定のファイルタイプだけを処理することができる。
例えば、RubyCocoa で、Open Panel を使ってフォルダを指定して、その中のファイルを処理させるとかに使う。