如何删除不为空的整个目录?
How to delete the whole directory which is not empty?
我想清理用于收集资源的临时文件。
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.
您可以使用 os:cmd 通过控制台命令删除目录,尽管这是一种粗略的方法。对于类 unix OS 它将是:
os:cmd("rm -Rf " ++ DirPath).
如果你想使用适当的 erlang 函数删除一个非空目录,你必须递归地执行它。 here 中的以下示例显示了如何执行此操作:
-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 中的另一种方法(使用的唯一真正原因是保持平台独立性):
-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).
上面的例子对当前目录相对于目标目录做出了一些假设——如果这对您的使用来说是一个问题,那么明确设置工作目录并完全限定目标路径可能是明智的.
值得注意的是,类似的方法也可用于递归复制目录。
现在可以使用最新版本的 Erlang/OTP(尚未发布),使用 file:del_dir/2
API.
可用选项:
- recursive: 在删除目录本身之前递归删除目录的内容
- force: 忽略访问或删除文件或目录时的错误
- keeptop: 最顶层目录不删除
我想清理用于收集资源的临时文件。
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.
您可以使用 os:cmd 通过控制台命令删除目录,尽管这是一种粗略的方法。对于类 unix OS 它将是:
os:cmd("rm -Rf " ++ DirPath).
如果你想使用适当的 erlang 函数删除一个非空目录,你必须递归地执行它。 here 中的以下示例显示了如何执行此操作:
-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 中的另一种方法(使用的唯一真正原因是保持平台独立性):
-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).
上面的例子对当前目录相对于目标目录做出了一些假设——如果这对您的使用来说是一个问题,那么明确设置工作目录并完全限定目标路径可能是明智的.
值得注意的是,类似的方法也可用于递归复制目录。
现在可以使用最新版本的 Erlang/OTP(尚未发布),使用 file:del_dir/2
API.
可用选项:
- recursive: 在删除目录本身之前递归删除目录的内容
- force: 忽略访问或删除文件或目录时的错误
- keeptop: 最顶层目录不删除