Erlang 之文件处理总结

来源:互联网 发布:windows下安装pyqt5 编辑:程序博客网 时间:2024/06/06 05:29
文件操作主要有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 0
原创粉丝点击