File 文件上的Erlang生成错误:写入文件(文件名、数据、[append])

File 文件上的Erlang生成错误:写入文件(文件名、数据、[append]),file,erlang,File,Erlang,此代码在文件上生成错误:write_文件(文件名,数据,[append]) {{badmatch,{error,enoint},[{t,save,2,[{file,“1.erl”},{line,38}]} case file:read_file_info(Filename) of {error, Reason} -> {ok, IoDevice}=file:open(Filename, [write, binary]), file:write_file(Fi

此代码在文件上生成错误:write_文件(文件名,数据,[append])

{{badmatch,{error,enoint},[{t,save,2,[{file,“1.erl”},{line,38}]}

case file:read_file_info(Filename) of
    {error, Reason} ->
      {ok, IoDevice}=file:open(Filename, [write, binary]),
      file:write_file(Filename, Data, [append]),  % line 38
      file:close(Filename),
      ok;
    {ok, FileInfo} -> ok
  end.

这是错误的?

首先,如果要使用write_file(),不需要先打开它。但是每次都会覆盖整个文件-不能追加。您应该改为使用file:write(IoDevice,Data),并在file:open()的选项中使用'append'而不是'write'


第二,当您关闭文件时,应该将IoDevice作为参数,而不是文件名。

这段代码中似乎存在争用条件

如果我是正确的,您可以使用文件:open在文件不存在时创建一个文件,然后在其中附加一些数据

似乎在文件准备好写入底层系统之前就获得了IoDevice,当您使用不同的访问类型(忽略刚刚创建的文件句柄)时,追加失败

如果您在shell中用两个单独的命令执行这两行,您将看到它是有效的

更好的代码应该是:

append(Filename,Data) ->
case file:read_file_info(Filename) of
    {error, enoent} ->
      file:write_file(Filename, Data);  % create the file and write
    {ok, _FileInfo} ->
      file:write_file(Filename, Data,[append]) % append data to existing file
end.