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

Erlang递归列举目录下文件的更多相关文章

  1. python生成器 获取 目录下文件

    # os.walk()和os.list 都是得到所有文件的列表, 如果目录下文件特别多, 上亿了, 我们就需要生成器的方式获取 # 要求目录下面没有目录, 会递归到子目录下面找文件, (如果有子目录可 ...

  2. (实用篇)PHP不用递归遍历目录下所有文件的代码

    <?php /** * PHP 非递归实现查询该目录下所有文件 * @param unknown $dir * @return multitype:|multitype:string */ fu ...

  3. Java递归列出目录下全部文件

    Java递归列出目录下全部文件 /** * 列出指定目录的全部内容 * */ import java.io.*; class hello{ public static void main(String ...

  4. Java基础---Java---IO流-----File 类、递归、删除一个带内容的目录、列出指定目录下文件夹、FilenameFilte

    File 类 用来将文件或者文件夹封装成对象 方便对文件与文件夹进行操作. File对象可以作为参数传递给流的构造函数 流只用操作数据,而封装数据的文件只能用File类 File类常见方法: 1.创建 ...

  5. File类 递归 获取目录下所有文件文件夹

    package com.xiwi; import java.io.*; import java.util.*; class file{ public static void main(String a ...

  6. (第三周)wc.exe—命令行实现对指定目录下文件的操作

    一.用户需求 程序处理用户需求的模式为: wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下: 1.基本功能 支持 -c ...

  7. shell脚本 批量转换目录下文件编码

    发布:JB01   来源:脚本学堂     [大 中 小] 分享一例shell脚本,实现可以批量转换目录下的文件编码,很实用的一个小shell,有需要的朋友参考下.原文地址:http://www.jb ...

  8. C# 获取目录下文件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. linux 目录下文件批量植入和删除,按日期打包

    linux目录下文件批量植入 [root@greymouster http2]# find /usr/local/http2/htdocs/ -type f|xargs sed -i "   ...

随机推荐

  1. react-router 4实现代码分割(code spliting)

    官方一开始推荐的使用bundle-loader来做代码分割的方式感觉有点麻烦,而且代码看起来有点不舒服.而且需要一直依赖bunder-loader 一开始我想为什么不能像vue一样,直接使用ES的新特 ...

  2. PHPCMS v9.5.6 通杀getshell(前台)

    漏洞url:http://wooyun.jozxing.cc/static/bugs/wooyun-2014-062881.html 很好的fuzz思路. 文章提到:文件名前面的数字是被"干 ...

  3. [HNOI 2009]梦幻布丁

    Description 题库链接 维护一个序列 \(A\) .支持以下操作: \(X~Y\) 将序列中所有的 \(X\) 变成 \(Y\) : 询问序列颜色段数. \(1\leq n,m\leq 10 ...

  4. 【BZOJ1060】【ZJOI2007】时态同步

    Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板 ...

  5. codeforces round #405 B. Bear and Friendship Condition

    B. Bear and Friendship Condition time limit per test 1 second memory limit per test 256 megabytes in ...

  6. Linux上安装Libssh2

    由于项目需要使用libssh2,在安装时,遇到一些问题,发现网上的都是互相抄,把自己遇到的问题,记下来,希望可以帮助到别人,自己下次使用时候,也方便查找,节约时间. 安装的流程: 1.下载源码,wge ...

  7. hdu3340 线段树+多边形

    Rain in ACStar Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. 树莓派超声波测距+蜂鸣器(c语言)

    前边我们已经详细的讲解了树莓派控制超声波模块测距(http://www.cnblogs.com/yuemo/p/8888342.html)和超声波控制蜂鸣器模块发声(http://www.cnblog ...

  9. 以太坊MetaMask钱包插件简介

    MetaMask是一个以太坊钱包插件,虽然只能在Chrome浏览器中使用,但作为以太坊钱包的metamask却很受以太坊开发者欢迎. MetaMask 评价(5★):安装设置:★★★★界面操作:★★★ ...

  10. 如何在Windows系统中设置Python程序定时运行

    文章出处:http://blog.csdn.net/wwy11/article/details/51100432 首先,我们肯定是要用到Windows下的[计划任务]功能 之后点击右侧的[创建基本任务 ...