Erlang 之文件处理总结

文件操作主要有4个module 
file  : 这个模块主要提供对文件基本操作的方法(譬如,打开关闭文件,读写文件内容等等) 
filename  : 这个模块提供跨平台处理文件名的方法(即,你不用关心你的代码是运行在linux平台还是windows平台) 
filelib  : 这个模块其实是file module的扩展,它提供了一些更常用的方法(即,对file模块中一些方法进行封装,从而提供更简便方法) 
io  : 这个模块用来读取和写入数据 

读文件  
1. file:consult(Filename) -> {ok, Terms} | {error, Reason} 
该方法用来从文件读取 erlang terms (注意文件中的每个term要用  .  分隔,如下图) 
 

我们使用consult方法来读取该文件: 
 

现在我们看下consult方法的实现源码(使用code:which(file)命令查找源码位置): 
 

其中: 
file:open方法用来打开文件,其完整定义为:file:open(Filename, Modes) -> {ok, IoDevice} | {error, Reason} 
file:close方法用来关闭文件,其完整定义为:file:close(IoDevice) -> ok | {error, Reason} 
实现原理:通过 io:read 方法循环读取文件中的 erlang term (每次读取一个),然后拼装到List中(注意,consult_stream方法是一个尾递归调用,因此不用担心它的效率) 

2.io:get_line(IoDevice, Prompt) -> Data | eof | {error, term()} 
该方法用来从IoDevice表示的输入设备中(譬如文件)读取" 一行 "数据,看个简单例子 
 

3.file: read_file(Filename) -> {ok, Binary} | {error, Reason} 
该方法用会将整个文件读入内存,然后以字节流(二进制)的形式返回文件内容( 这是一种非常高效读取文件的一种方式,但是若内存不够,会报错 ) 


4.file:pread(IoDevice, Location, Number) -> {ok, Data} | eof | {error, Reason} 
提供随机访问功能,从位置Location开始读取Number数量的字节 


写文件
 
1.format(IoDevice, Format, Data) -> ok 
这个方法很easy,就是把Data按照Format指定的输出格式,输出到IoDeveice中去(注意:IoDevice必须要以write模式打开) 
常用的格式符有:~n(输出换行符),~s(输出字符串),~w与~p(输出erlang term,目前我还不清楚两者区别) 

2.write_file(Filename, Bytes) -> ok | {error, Reason} 
这个方法用来高效的将字节流写入文件,我们看个简单例子 



目录操作  
1.file模块有三个方法来操作目录,他们分别是:list_dir(Dir),mark_dir(Dir),del_dir(Dir)(只能删除空目录),我们简单看下它们的使用例子: 
 

其中file:list_dir(".")中的. 代表当前目录 

现在假设,我们需要知道一个文件(目录)的名字,创建时间,以及大小该怎么半呢? 答案:调用file:read_file_info方法即可 
 

read_file_info返回的是一个信息全量,它的每个值代表的含义如下: 


但是,通常我们只需要其中的某些或者某个值(譬如,我只想知道ebin/data.dat文件的大小),这时候,我们就需要利用record file_info,若我们需要使用这个record,则要在文件开始处引入:-include_lib("kernel/include/file.hrl"). 现在假设我们要取ebin/data.dat文件大小,则可以: 


除了上面所说的方法,其实还有更简单的方式,直接调用filelib:file_size方法 
 

书中最后一个Find Utility例子还是挺有意思,为了截图方便(一屏),我将代码重写了一遍,现在贴上来: 


注意 在调用file_lib:is_dir方法时,需要传入全路径名(不然它会以当前路径为相对路径),我一开始没有注意到这一点,倒置结果总是不对 

现在我们运行程序并且和linux find命令比对结果: 


关于erlang文件处理,就说道这里,更多api细节文档请参看: 
http://www.erlang.org/doc/man/file.html  
http://www.erlang.org/doc/man/filename.html  
http://www.erlang.org/doc/man/filelib.html  
http://www.erlang.org/doc/man/io.html  

http://www.erlang.org/doc/man/re.html 

原文链接:http://diaocow.iteye.com/blog/1766128

感谢原创作者分享

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值