【发布时间】:2015-03-31 15:10:16
【问题描述】:
我有以下代码:
find_info(File) ->
case file:read_file_info(File) of
{ok, Facts} ->
case Facts#file_info.type of
directory -> directory;
regular -> regular
end;
{error,Reason} -> exit(Reason)
end.
find_files(Dir,Flag,Ending,Acc) ->
case file:list_dir(Dir) of
{ok,A} -> find_files_helper(A,Dir,Flag,Acc,Ending);
{_,_} -> Acc
end.
find_files_helper([H|Tail],Dir,Flag,Acc,Ending) ->
A = find_info(filename:absname_join(Dir,H)),
case A of
directory ->
case Flag of
true ->
find_files(filename:absname_join(Dir,H),Flag,Ending,Acc ++ find_files_helper(Tail,Dir,Flag,Acc,Ending));
false -> find_files_helper(Tail,Dir,Flag,Acc,Ending)
end;
regular ->
case filename:extension(H) of
Ending -> find_files_helper(Tail,Dir,Flag,[to_md5_large(H)] ++ Acc, Ending);
_ -> find_files_helper(Tail,Dir,Flag,Acc,Ending)
end;
{error,Reason} -> exit(Reason)
end;
find_files_helper([],_,_,Acc,_) -> Acc.
但是,每当我运行 find_files/4 时,程序在崩溃之前只会深入一个文件。 假设我有以下目录
home/
a/
ser.erl
b/
c/
file.erl
file2.erl
运行时我会得到file.erl 的file2.erl 和ser.erl 的md5。但是,如果目录如下所示:
home/
a/
ser.erl
back.erl
b/
c/
file.erl
file2.erl
然后整个程序崩溃。我花了几个小时寻找我的逻辑中缺少的东西,但我不知道。
我收到的错误消息是函数 p:to_md5_large/1 中的异常 enoent。
如果这里需要 md5,它是:
to_md5_large(File) ->
case file:read_file(File) of
{ok, <<B/binary>>} -> md5_helper(B,erlang:md5_init());
{error,Reason} -> exit(Reason)
end.
md5_helper(<<A:4/binary,B>>,Acc) -> md5_helper(B,erlang:md5_update(Acc,A));
md5_helper(A,Acc) ->
B = erlang:md5_update(Acc,A),
erlang:md5_final(B).
【问题讨论】:
-
你得到
enoent,因为当你不在back.erl所在的目录中时,你将back.erl之类的文件名传递给to_md5_large。尝试传递完整的文件名。 -
@SteveVinoski 想把它作为答案?