文件编程

erlang中操作文件的模块有:
file模块:包含用于文件的打开,关闭,读取,写入和目录列表等功能的函数
filename模块:提供了一套操作文件名的函数
filelib模块:file模块的扩展,提供了一套辅助函数用于生成文件列表,检查文件类型等操作
io模块:提供了一系列对已打开文件进行操作的函数

文件操作:
1.读取文件
1)从文件中读取所有erlang数据项:
data1.dat

//data1.dat的文本内容
{person, "joe", "armstrong",
[{occupation, programmer},
{favoriteLanguage, erlang}]}.

{cat, {name, "zorro"},
{owner, "joe"}}.

//读取
file:consult("data1.dat").

file:consult会假定file指定的文件中包含一串erlang的数据项,如果可以读取文件中的所有数据项,那么返回{ok,[Term]},否则返回{error,Reason}

2)从文件中一次读取一个erlang数据项:

{ok,S} = file:open("data1.dat",read).
io:read(S,'').
file:close(S).

首先利用file:open打开文件,然后使用io:read函数读取独立的数据项直到我们读到文件末尾,最后使用file:close来关闭文件。
file:open(File,read) -> {ok,IoDevice}|{error,Why}
io:read(IoDevice,Prompt) -> {ok,Term}|{error,Why}|eof 从IoDevice里面读取erlang数据项,如果IoDevice指定的是一个已经打开的文件,那么Prompt参数将被忽略,如果我们使用io:read来从标准输入读取,那么Prompt只用来提供一个提示符。
file:close(IoDevice) -> ok|{error,Why}

对于已经加载到系统中的所有模块,可以使用code:which来定位他们的文件存放位置。
code:which(file) 查找file模块的位置

3)从文件中一次读取一行数据:
io:get_line会不断读取字符串,直到遇到一个行尾符或者文档结束符。
io:get_line(S,'').

4)将整个文件的内容读取到一个二进制数据中:
使用file:read_file(File)来从一个文件里读取它的所有数据并将其放入一个二进制数据中.
file:read_file(File) -> {ok,Bin}|{error,Reason}
这种读取操作的效率很高

5)随机读取一个文件:
如果读取的文件很大,或者它包含的二进制数据使用了第三方定义的格式,那么我们可以raw模式下打开文件,然后使用file:pread函数从任何想要访问的位置读取文件。

{ok,S} = file:open(“data1.dat”,[read,binary,raw]).
file:pread(S,22,46).
file:close(S).

file:pread(IoDevice,Start,Len)会精确的从IoDevice的第Start个字节开始读,读取长度为Len的字节。

2.写入操作:
1)向一个文件中写入一串erlang数据项,标准库中没有实现,自己实现:

write_consult(File,L) ->
{ok,S} = file:open(File,write),
lists:foreach(fun(X) -> io:format(S,”~p~n”,[X]) end,L),
file:close(S).

要实现文件的写入,文件必须以write模式打开.
io:format(IoDevice,Format,Args) -> ok
Format是一个包含格式化代码的字符串,Args是一串需要输出的数据项。
常见的格式化命令:~p(完整的打印参数),~n(换行符),~s(参数是一个字符串),~w(以标准语法写入数据).

2)向文件中写入一行:
和上面写入erlang数据项基本一样,只不过格式代码由~p变为~s

3)一步写入整个文件:
file:write_file(File,Io)把数据写入Io,这里的Io指的是文件File的Io列表(所谓Io列表其实就是一个列表,它的元素是二进制数据,0-255的整数或者IO列表本身。如果输出一个IO列表,它会自动平坦化,也就是说列表之中所有的方括号都会被删除)。

4)随机写入文件:
与在随机访问模式下的读文件类似。以write模式来打开文件,然后用file:pwrite(Position,Bin)来写文件。

{ok,S} = file:open(“…”,[raw,write,binary]).
file:pwrite(S,10,<<”new”>>).
file:close(S).

在文件的第10个字节处写入一串新的字符串。会覆盖掉原先的内容。

3.目录操作:
list_dir(Dir):用于生成Dir目录下的文件列表。
make_dir(Dir):创建一个新目录
del_dir(Dir):删除目录。

4.查看文件的属性:
file:read_file_info(F):查看文件的属性。如果F是合法的文件名或目录名,那么这个函数会返回{ok,Info},其中Info是一个类型为#file_info的记录。
#file_info的定义如下:
-record(file_info,{size,type,assess,atime,mtime,ctime,mode,links,major_device}).

filelib模块导出了一些日常使用的函数,如:file_size(File),is_dir(File),这些函数只是对read_file_info的封装。

5.复制和删除文件:
file:copy(Source,Destination).复制文件
file:delete(File).删除文件。

文件编程常用函数:
change_group:修改一个文件的文件群组
change_owner:修改一个文件的所有者。
change_time:修改一个文件的最近访问时间或者最新更新时间
close:关闭一个文件
consult:从一个文件中读取erlang值
copy:复制文件内容
del_dir:删除一个目录
delete:删除一个文件
eval:在文件中对一个erlang表达式求值
format_error:返回一个错误原因的描述字符串
get_cwd:得到当前工作目录
list_dir:获取一个目录中文件列表
make_dir:创建一个目录
make_link:为一个文件创建一个硬链接(hardlink).
make_symlink:为一个文件或目录创建符号链接(symbolic link)
open:打开一个文件
position:设置一个文件的访问位置
pread:在一个特定的文件访问位置上读取文件
pwrite:在一个特定的文件访问位置上写入文件
read:从文件中读取内容
read_file:读取整个文件
read_file_info:获取一个文件的信息。
read_link:查看一个文件的连接指向.
read_link_info:查看一个文件或链接的信息。
rename:重命名一个文件
script:对一个文件中的erlang表达式求值并返回结果。
set_cwd:设定当前的工作目录
sync:把一个文件的内存状态同步到该文件的物理存储上
truncate:截断一个文件。
write:向一个文件写入数据
write_file:写入整个文件
write_file_info:修改一个文件的信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值