ファイルタイプの判定
ディレクトリ走査のためにファイルタイプ判定をしたくなった.
file:read_file_info/1を使うとファイルに関する情報が得られる.
> file:read_file_info("."). {ok,{file_info,4096,directory,read_write, {{2009,12,31},{4,5,38}}, {{2009,12,31},{4,6,13}}, {{2009,12,31},{4,6,13}}, 16877,2,2049,0,5991395,1000,1000}}
このdirctoryの部分を取得すればよいのだけれど,パターンマッチで取得するのは相当面倒くさい.
Programming Erlang 13章の最後 (原書pp.236-237) に書いてある方法を使ってファイルタイプを取得する.
-include_lib("kernel/include/file.hrl"). file_type (File) -> case file:read_file_info(File) of {ok, Facts} -> case Facts#file_info.type of regular -> regular; directory -> directory; _ -> error end; _ -> error end.
最初の行はおまじない.これによってread_file_info/1の返り値をrecord (構造体) と見なすことができるようになり,上述のように#file_info.typeで目的の値を取得できる.
include_libが気持ち悪ければ,以下のように気合いの入ったパターンマッチで取得する.
file_type_plain (File) -> case file:read_file_info(File) of {ok,{_,_Size,Type,_Perm,_,_,_,_,_,_,_,_,_,_}} -> case Type of regular -> regular; directory -> directory; _ -> error end; _ -> error end.