Erlang 如何删除不为空的整个目录?

Erlang 如何删除不为空的整个目录?,erlang,Erlang,我想清理临时文件夹以收集资源。 文件模块只有del_dir/1,它要求目录为空。但是没有函数获取目录中的所有文件(使用绝对路径) 源代码如下,如何更正 delete_path(X)-> {ok,List} = file:list_dir_all(X), %% <--- return value has no absolute path here lager:debug("_229:~n\t~p",[List]), lists:map(fun(X)->

我想清理临时文件夹以收集资源。
文件
模块只有del_dir/1,它要求目录为空。但是没有函数获取目录中的所有文件(使用绝对路径)

源代码如下,如何更正

 delete_path(X)->
    {ok,List} = file:list_dir_all(X), %% <--- return value has no absolute path here
    lager:debug("_229:~n\t~p",[List]),
    lists:map(fun(X)->
                      lager:debug("_231:~n\t~p",[X]),
                        ok = file:delete(X)
                end,List),
    ok = file:del_dir(X),
    ok.
删除路径(X)->
{ok,List}=file:List_dir_all(X),%%
lager:debug(“\u 231:~n\t~p,[X]),
确定=文件:删除(X)
完,名单),,
确定=文件:del_dir(X),
好啊

您可以使用os:cmd通过控制台命令删除目录,尽管这是一种粗略的方法。对于类unix操作系统,它将是:

os:cmd("rm -Rf " ++ DirPath).
如果要使用适当的erlang函数删除非空目录,则必须递归执行。中的以下示例演示了如何执行此操作:

-module(directory).
-export([del_dir/1]).

del_dir(Dir) ->
   lists:foreach(fun(D) ->
                    ok = file:del_dir(D)
                 end, del_all_files([Dir], [])).

del_all_files([], EmptyDirs) ->
   EmptyDirs;
del_all_files([Dir | T], EmptyDirs) ->
   {ok, FilesInDir} = file:list_dir(Dir),
   {Files, Dirs} = lists:foldl(fun(F, {Fs, Ds}) ->
                                  Path = Dir ++ "/" ++ F,
                                  case filelib:is_dir(Path) of
                                     true ->
                                          {Fs, [Path | Ds]};
                                     false ->
                                          {[Path | Fs], Ds}
                                  end
                               end, {[],[]}, FilesInDir),
   lists:foreach(fun(F) ->
                         ok = file:delete(F)
                 end, Files),
   del_all_files(T ++ Dirs, [Dir | EmptyDirs]).

Erlang中的另一种方法(使用Erlang的唯一真正原因是维护平台独立性):

上面的示例对当前目录与目标目录之间的关系做了一些假设——如果这是一个供您使用的问题,则建议显式设置一个工作目录并完全限定到目标目录的路径


值得注意的是,类似的方法也可以用于递归复制目录。

现在,最新版本的Erlang/OTP(尚未发布)也可以使用
文件:del_dir/2
API实现这一点

可用选项:

  • 递归:在删除目录本身之前递归删除目录的内容
  • 强制:访问或删除文件或目录时忽略错误
  • keeptop:不会删除最顶端的目录

来源:

可能一个明智的想法是避免硬编码路径分隔符(
++“/”++
),而是改用
filename:join/1
。这将保留解决方案的可移植性,我想这是反对使用
os:cmd/1
的要点。
-spec rm_rf(file:filename()) -> ok.

rm_rf(Dir) ->
    Paths = filelib:wildcard(Dir ++ "/**"),
    {Dirs, Files} = lists:partition(fun filelib:is_dir/1, Paths),
    ok = lists:foreach(fun file:delete/1, Files),
    Sorted = lists:reverse(lists:sort(Dirs)),
    ok = lists:foreach(fun file:del_dir/1, Sorted),
    file:del_dir(Dir).