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
相关文章
- linux下使用 du查看某个文件或目录占用磁盘空间的大小
- [转帖]linux下使用 du查看某个文件或目录占用磁盘空间的大小
- linux递归查找目录下所有文件夹以及文件 - YongjieShi
- linux 递归的改变当前文件及子目录的权限
- windows 下 git bash 打开特定的文件目录与相关操作
- linux下使用du命令查看某个文件或目录占用磁盘空间的大小
- python学习:递归列出目录里的文件
- Mac系统下,VM虚拟机提示“打不开 /dev/vmmon: 无此文件或目录.”
- VMware下tar zxpf -无法open: 没有该文件或目录
- windows下使用pyinstaller将多个目录的Python文件打包成exe可执行文件