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
相关文章
- windows下获取文件上传路径报错:: (文件名、目录名或卷标语法不正确。)
- UNIX命令,统计当前目录(含子目录)下所有后缀为.log的文件中ERROR出现的行数
- XAMPP环境下,如何将项目目录设置在任意位置且不影响htdocs内的文件访问
- Linux 下删除文件夹文件或目录的各种方法
- linux系统下修改文件夹目录权限
- Windows下快速删除上万个文件和子目录(快速删除文件) 命令行cmd快速删除文件夹
- linux下安装libcurl过程及开发遇到的问题"curl/:没有那个文件或目录"
- linux下安装libcurl过程及开发遇到的问题"curl/:没有那个文件或目录"缺少头文件解决方法
- Linux 下 删除当前目录下的所有文件保留最新的 3 个文件
- linux下替换不同目录下的文件的字符串