Erlang递归列举目录下文件

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


   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值