金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  423 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
Erlang递归列举目录下文件
(金庆的专栏)

%%%-------------------------------------------------------------------
%%% @author jinqing
%%% @copyright (C) 2015, <COMPANY>
%%% @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

posted on 2015-05-05 17:11 金庆 阅读(607) 评论(0)  编辑 收藏 引用 所属分类: 7. Erlang

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理