ファイルタイプの判定

ディレクトリ走査のためにファイルタイプ判定をしたくなった.
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.