[Erlang] Рекурсивный обход директорий
От: Mamuthttp://dmitriid.com
Дата: 23.01.06 13:50
Оценка:
Только не смейтесь над убогим

Надо было мне тут совершить обход директорий и вытащить список как директорий, так и файлов — с размерами файлов.

Значит, наваял я вот такое. На названия не обращайте внимания, тяжелое наследие первых родов ежей против шерсти
-module(mamut_parse_dir).

-export([parse_dir/1]).


%% Вызываем, собственно, вот эту самую функцию
parse_dir(PathToDir) -> 
    case filelib:is_dir(PathToDir) of
        false -> {error, not_a_dir};
        true -> 
            {Dir, parse_dirs(get_dirs(PathToDir)), get_files(PathToDir)}.
    end.

parse_dirs([]) ->    
    [];
parse_dirs([H|T]) -> 
    [H, get_files(H)] ++ [parse_dirs(T)].

%% Берем список поддиректорий, стырено здесь: http://schemecookbook.org/Erlang/FileWalkDirectoryTree
get_dirs(Path) ->
    P = filename:join(Path, "*"),
    lists:filter(
        fun(X) -> filelib:is_dir(X) end, 
        filelib:wildcard(P)).

%% Берем список файлов, творчески обработанная функчия сверху
%% Возвращаю кортеж {имя_файла, размер_файла}
get_files(Path) ->
    P = filename:join(Path, "*"),
    lists:map(fun(X) -> {X, filelib:file_size(X)} end,
        lists:filter(
            fun(X) -> filelib:is_regular(X) end, 
            filelib:wildcard(P))).


В общем мне понравилось Но вопрос — а можно еще кратчее и красивше
... << RSDN@Home 1.2.0 alpha rev. 619>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.