2014-04-30 42 views
1

此代碼生成錯誤上的文件:WRITE_FILE(文件名,數據,[附加]),二郎生成錯誤上的文件:WRITE_FILE(文件名,數據,[附加])

{{badmatch,{錯誤,ENOENT} },[{T,保存,2,[{文件, 「1.erl」},{線,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. 

這是錯誤?

回答

2

首先,如果你想使用write_file(),你不需要先打開它。但是每次都會覆蓋整個文件 - 不能追加。您應該使用file:write(IoDevice,Data),並在選項file:open()中使用'append'而不是'write'。

其次,關閉文件時,應該將IoDevice作爲參數,而不是文件名。

+0

感謝它的工作 – user3572870

0

看來這個代碼中存在競爭條件。

如果我沒有問題,則使用file:open創建一個不存在的文件,然後在其中添加一些數據。

在文件準備好寫入底層系統之前,您似乎已經獲得了IoDevice,並且當您使用不同的訪問類型(忽略剛剛創建的文件句柄)時,append失敗。

如果你在shell中執行2行,在2個單獨的命令中,你會看到它的工作原理。

更好的代碼應該是:

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.