IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Erlang递归列举目录下文件

    金庆发表于 2015-05-05 09:11:00
    love 0
    Erlang递归列举目录下文件
    (金庆的专栏)

    %%%-------------------------------------------------------------------
    %%% @author jinqing
    %%% @copyright (C) 2015,
    %%% @doc 递归列举目录下的所有文件。
    %%%
    %%% @end
    %%% Created : 29. 四月 2015 16:02
    %%%-------------------------------------------------------------------
    -module(dir_util).
    -author("jinqing").

    %% API
    -export([list_dir_recursive/1]).

    %% 列举数据表目录下的所有文件,包括子目录中的。
    %% 返回文件名都带有 Dir 前缀,
    %% 如:["Dir/a.dat", "Dir/b/b.dat"]
    -spec(list_dir_recursive(Dir :: string()) -> [string()]).
    list_dir_recursive(Dir) when is_list(Dir) ->
    list_dirs_r([Dir], []).

    %%%===================================================================
    %%% Internal functions
    %%%===================================================================

    %% List recursively all files in dir/file list.
    %% Returns (files ++ Acc).
    list_dirs_r([] = _Files, Acc) ->
    Acc;
    list_dirs_r([File | Tail] = _Files, Acc) ->
    case filelib:is_dir(File) of
    true -> case file:list_dir(File) of
    {ok, NewFiles} ->
    FullNewFiles = [filename:join(File, N) || N <- NewFiles],
    list_dirs_r(FullNewFiles ++ Tail, Acc);
    {error, Reason} ->
    lager:error("List dir(~p): ~p", [File, Reason]),
    list_dirs_r(Tail, Acc) % Ignore dir if error
    end;
    false -> list_dirs_r(Tail, [File | Acc])
    end.

    list_dirs_r()是尾递归。
    列出当前目录下的所有文件和目录,放在Files变量中。
    Acc是累加器,是一个列表,收集所有文件。
    取Files中头部元素,如果是文件,则放入Acc结果集,继续处理余下的Files,
    如果是目录,则列出该目录下所有,替换到 Files 头部。
    性能消耗在
    filename:join(File, N)
    FullNewFiles ++ Tail



    金庆 2015-05-05 17:11 发表评论


沪ICP备19023445号-2号
友情链接