erlang文件操作

http://www.blogjava.net/killme2008/archive/2007/09/27/148747.html

http://fair-jm.iteye.com/blog/1897875



Erlang用于操纵文件I/O的模块有:
file模块:打开、读、写、关闭文件已经操作目录的方法基本都在这里

filename模块:提供平台独立方式用于操纵文件名

filelib模块:file模块的扩展,提供了更多的实用工具,在file模块基础上构建

io模块:一系列用于操作打开的文件的方法,解析格式、格式化输出等等。

1.打开文件:
{ok,F}=file:open("data1.dat",read). %读模式打开
{ok,F}=file:open("data1.dat",write). %写模式
{ok,F}=file:open("data1.dat",[read,write]). %读、写、二进制模式

支持的所有模式参见文档。

2.读取:
(1)如果以一个Erlang term的方式读取,采用:
io:read(F,'').
其中第二个参数是提示符,用于在标准输入时作为提示。
这个方法有一个变形read/3
read(IoDevice, Prompt, StartLine)
第三个参数用于指定开始行数。

(2)如果是按字节读取,文件必须按raw模式打开采用:
{ok, Data}=file:read(F,100).

(3)按行读取:
io:get_line(F, '').

(4)读取整个文件的内容:
{ok,Binary}=file:read_file("data1.dat").
注意返回的是一个binary类型

(5)随机读取:
{ok,Binary}=file:pread(F, 22, 46).

其中第二个参数是开始位置,第三个参数是读取的长度,返回的也是binary类型。

3.写入文件:
(1)采用io:format/3方法:
{ok, S} = file:open("test2.dat", write).
io:format(S, "~s~n", ["Hello readers"]).
io:format(S, "~w~n", [123]).

其中的~开头的字符是一个个格式化命令,比如常见的:
~c   anscii码
~f   浮点数
~s   字符串
~w   Erlang term
~p   与~w类似,不过当多行时将自动换行
~n   显然,换行符

(2)写入整个文件:
file:write_file(File, IO)

其中IO可以为list、integer或者binary类型

(3)随机写入:
file:pwrite(F, 10, <<"new">>)

4.关闭文件:
file:close(F).

5.目录操作:
都是linux命令风格的操作,
cd("/home/dennis/").  %进入目录
file:list_dir(".").   %列出当前目录文件
file:make_dir("test").  %创建test目录
file:del_dir("test").   %删除test目录

6.获取文件信息,比如文件大小,最后修改时间等等。调用file:read_file_info/1方法,该方法返回一个file_info记录类型,里面拥有文件的具体信息,比如type、size等。
{ok, Facts} =file:read_file_info(File).
io:format("~s~n",{Facts#file_info.type, Facts#file_info.size}).

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

    这个笔记仅仅记录了一些常用到的方法,一些高级的工具方法并没有涉及,具体参考Erlang的文档。



erlang关于文件操作的模块还是很多的

stdlib下有filelib filename和file_sorter 

核心模块有file 当然io的一些导出函数也可以用来对文件进行读写

 

这里简要记下笔记

 

首先是filelib

Shell代码   收藏代码
  1. 9> ls().  
  2. doc                  factorial.beam       factorial.erl  
  3. fibo.beam            fibo.erl             head_test.hrl  
  4. iotest.beam          iotest.erl           message.beam  
  5. message.erl          procedure.beam       procedure.erl  
  6. recode_test.beam     recode_test.erl      show_ip.beam  
  7. show_ip.erl          \x{6D4B}\x{8BD5}.txt  
  8. ok  
  9. 10> filelib:ensure_dir("doc").  
  10. ok  
  11. 11> filelib:ensure_dir("cc").  
  12. ok  

 文档中解释是返回ok代表在在所有的父目录中存在或可以创建这个以输入为文件名的文件或者文件夹

 错误的话返回{error, Reason}代表不存在也不能被创建

 

 file_size/1 返回对应文件的字节数

 is_dir/1 返回是否是目录

 is_file/1 返回是否是文件(非目录)

 is_regular 返回是否是正常文件(?)

 last_modified/1 返回对应文件最后修改时间

 wildcard 显示匹配通配符的文件的文件名

 这些使用起来都很简单 就写一个例子:

 

Shell代码   收藏代码
  1. 33> filelib:fold_files(".",".*.erl",false,fun(Name,X) -> io:format("~20s ~p ~p ~p ~n",[Name,filelib:file_size(Name),filelib:last_modified(Name),fil  
  2. elib:is_file(Name)]) end,0).  
  3.      ./factorial.erl 84 {{2013,6,22},{23,46,56}} true  
  4.           ./fibo.erl 195 {{2013,6,22},{22,59,39}} true  
  5.         ./iotest.erl 140 {{2013,6,23},{0,36,29}} true  
  6.        ./message.erl 805 {{2013,6,23},{15,45,51}} true  
  7.      ./procedure.erl 383 {{2013,6,25},{19,17,27}} true  
  8.    ./recode_test.erl 180 {{2013,7,1},{12,53,22}} true  
  9.        ./show_ip.erl 180 {{2013,6,28},{15,18,35}} true  
  10. ok  

 

以上代码对中文支持不行(不会显示中文 会打出string的list 所以那个~20s应该换为~p比较合适) 不会打印出文件夹(要全部打印可以通过wildcard匹配*之类的完成)

文件夹的is_file/1返回的也是true 而不是false 要判断直接用is_dir/1

 

 

filename的doc里密密麻麻都是例子我就懒得自己动手了...

 

 

file模块的操作不怎么麻烦

举几个例子:

 

文件夹建立删除:

Shell代码   收藏代码
  1. 59> file:del_dir("cc").  
  2. ok  
  3. 60> file:make_dir("cc").  
  4. ok  

 

读取文件:

可以用read_file/1 指定一下文件路径和文件名一口气读完 也可以用read/2 用read/2之前要对文件进行open操作获得IoDevice:

Shell代码   收藏代码
  1. 64> {ok,File}=file:open("fibo.erl",[raw,read]).  
  2. {ok,{file_descriptor,prim_file,{#Port<0.538>,728}}}  
  3. 65> {ok,Data}=file:read(File,filelib:file_size("fibo.erl")).  
  4. {ok,"-module(fibo).\r\n-export([fibo/1]).\r\n\r\n%% fibo(1) -> 1;\r\n%% fibo(2) -> 1;\r\n%% fibo(N) ->  fibo(N-1)+fibo(N-2).\r\n\r\nfibo(N) when N>  
  5. 0 ->\r\n case N of\r\n   1 ->1;\r\n   2 ->1;\r\n   _ ->fibo(N-1)+(N-2) end."}  
  6. 66> Data.  
  7. "-module(fibo).\r\n-export([fibo/1]).\r\n\r\n%% fibo(1) -> 1;\r\n%% fibo(2) -> 1;\r\n%% fibo(N) ->  fibo(N-1)+fibo(N-2).\r\n\r\nfibo(N) when N>0 ->  
  8. \r\n case N of\r\n   1 ->1;\r\n   2 ->1;\r\n   _ ->fibo(N-1)+(N-2) end."  

 当然用完关一下..file:close(File).

 

 写文件也一样简单:

Shell代码   收藏代码
  1. 70> {ok,File}=file:open("fibo.erl",[append]).  
  2. {ok,<0.121.0>}  
  3. 71> file.write(File,<<"hello 你好")>).  
  4. 1: syntax error before: '.'  
  5. 71> file:write(File,<<"hello 你好")>).  
  6. 1: syntax error before: ')'  
  7. 71> file:write(File,<<"hello 你好">>).  
  8. ok  
  9. 72> file:close(File).  
  10. ok  

 注意open的参数有很多 这边不一一列举 file模块很多操作都和平台有关.

这边还有一个方便使用的read_line/1函数:

Shell代码   收藏代码
  1. 77> file:read_line(File).  
  2. {ok,"-module(fibo).\n"}  
  3. 78> file:read_line(File).  
  4. {ok,"-export([fibo/1]).\n"}  
  5. 79> file:read_line(File).  
  6. {ok,"\n"}  
  7. 80> file:read_line(File).  
  8. {ok,"%% fibo(1) -> 1;\n"}  
  9. 81> file:read_line(File).  
  10. {ok,"%% fibo(2) -> 1;\n"}  
  11. 82> file:read_line(File).  
  12. {ok,"%% fibo(N) ->  fibo(N-1)+fibo(N-2).\n"}  
  13. 83> file:read_line(File).  
  14. {ok,"\n"}  
  15. 84> file:read_line(File).  
  16. {ok,"fibo(N) when N>0 ->\n"}  
  17. 85> file:read_line(File).  
  18. {ok," case N of\n"}  
  19. 86> file:read_line(File).  
  20. {ok,"   1 ->1;\n"}  
  21. 87> file:read_line(File).  
  22. {ok,"   2 ->1;\n"}  
  23. 88> file:read_line(File).  
  24. {ok,"   _ ->fibo(N-1)+(N-2) end."}  
  25. 89> file:read_line(File).  
  26. eof  
  27. 90> file:read_line(File).  
  28. eof  

 不太友好返回了个\n可以用正则处理掉 \\n$

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值