gpt4 book ai didi

erlang - file :write_file/2 returns {error, badarg} 当给定二进制文件时

转载 作者:行者123 更新时间:2023-12-02 11:44:54 25 4
gpt4 key购买 nike

我被 Joe Armstrong 编写的《Programming Erlang》(第二版)的第一个编程练习所困扰。第二章介绍了一个在文件服务器及其客户端本地运行的简短程序。该示例仅允许客户端列出并从服务器获取文件。本练习要求您通过添加 put_file 功能来增强它。

因此,我添加了一个 case 条件来接收带有 put_file 原子的消息,并使用与源相同的文件名写入它们。然后我向客户端添加了一个函数来读取文件的内容并将其名称和内容发送到服务器。

不幸的是,每次消息到达服务器时,服务器都会告诉我,我向 file:write_file/2 函数传递了一个错误的参数(它返回 {error, badarg })。假设文件名参数是正确的,我检查了文档,并且 file:read_file/1 返回一个二进制文件,而 file:write_file/2 接受一个 iodata,其中,如果我正确解释了文档,则可以是 iolist 或二进制文件。

iodata = iolist() | binary()

我想说类型是正确的,但我很确定我遗漏了一些东西。

这是代码。

afile_server.erl

-module(afile_server).
-export([start/1, loop/1]).

start(Dir) -> spawn(afile_server, loop, [Dir]).

loop(Dir) ->
receive
{Client, list_dir} ->
Client ! {self(), file:list_dir(Dir)};
{Client, {get_file, File}} ->
Full = full(Dir, File),
Client ! {self(), file:read_file(Full)};
{Client, {put_file, File, Binary}} ->
Full = full(Dir, File),
Client ! {self(), file:write_file(Full, Binary)}
end,
loop(Dir).

full(Dir, File) -> filename:join(Dir, File).

afile_client.erl

-module(afile_client).
-export([ls/1, get_file/2, put_file/2]).

ls(Server) ->
Server ! {self(), list_dir},
receive
{Server, FileList} ->
FileList
end.

get_file(Server, File) ->
Server ! {self(), {get_file, File}},
receive
{Server, Content} ->
Content
end.

put_file(Server, File) ->
Binary = file:read_file(File),
Server ! {self(), {put_file, File, Binary}},
receive
{Server, ok} ->
ls(Server);
{Server, {error, Reason}} ->
Reason
end.

最佳答案

file:read_file/1 返回 {ok, Binary}{error, Reason}。您在 put_file 消息中将其作为 Binary 传递,这就是为什么当您尝试将其传递给 file:write_file/2 时会收到错误>.

改变

二进制=文件:read_file(文件)

{ok,二进制} = file:read_file(文件)

它应该可以工作。

关于erlang - file :write_file/2 returns {error, badarg} 当给定二进制文件时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27579628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com