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

Che*_* Yu 4 erlang

我想清理临时收集资源。该file模块只有 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.
Run Code Online (Sandbox Code Playgroud)

Dan*_*nko 5

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

os:cmd("rm -Rf " ++ DirPath).
Run Code Online (Sandbox Code Playgroud)

如果要使用适当的 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]).
Run Code Online (Sandbox Code Playgroud)

  • 也许一个明智的想法是避免对路径分隔符进行硬编码(`++ "/" ++`),而是使用 `filename:join/1` 来代替。这将保留解决方案的可移植性,我想这是反对使用“os:cmd/1”的要点。 (2认同)