erlang关于文件操作的模块还是很多的
stdlib下有filelib filename和file_sorter
核心模块有file 当然io的一些导出函数也可以用来对文件进行读写
这里简要记下笔记
首先是filelib
9> ls(). doc factorial.beam factorial.erl fibo.beam fibo.erl head_test.hrl iotest.beam iotest.erl message.beam message.erl procedure.beam procedure.erl recode_test.beam recode_test.erl show_ip.beam show_ip.erl \x{6D4B}\x{8BD5}.txt ok 10> filelib:ensure_dir("doc"). ok 11> filelib:ensure_dir("cc"). ok
文档中解释是返回ok代表在在所有的父目录中存在或可以创建这个以输入为文件名的文件或者文件夹
错误的话返回{error, Reason}代表不存在也不能被创建
file_size/1 返回对应文件的字节数
is_dir/1 返回是否是目录
is_file/1 返回是否是文件(非目录)
is_regular 返回是否是正常文件(?)
last_modified/1 返回对应文件最后修改时间
wildcard 显示匹配通配符的文件的文件名
这些使用起来都很简单 就写一个例子:
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 elib:is_file(Name)]) end,0). ./factorial.erl 84 {{2013,6,22},{23,46,56}} true ./fibo.erl 195 {{2013,6,22},{22,59,39}} true ./iotest.erl 140 {{2013,6,23},{0,36,29}} true ./message.erl 805 {{2013,6,23},{15,45,51}} true ./procedure.erl 383 {{2013,6,25},{19,17,27}} true ./recode_test.erl 180 {{2013,7,1},{12,53,22}} true ./show_ip.erl 180 {{2013,6,28},{15,18,35}} true ok
以上代码对中文支持不行(不会显示中文 会打出string的list 所以那个~20s应该换为~p比较合适) 不会打印出文件夹(要全部打印可以通过wildcard匹配*之类的完成)
文件夹的is_file/1返回的也是true 而不是false 要判断直接用is_dir/1
filename的doc里密密麻麻都是例子我就懒得自己动手了...
file模块的操作不怎么麻烦
举几个例子:
文件夹建立删除:
59> file:del_dir("cc"). ok 60> file:make_dir("cc"). ok
读取文件:
可以用read_file/1 指定一下文件路径和文件名一口气读完 也可以用read/2 用read/2之前要对文件进行open操作获得IoDevice:
64> {ok,File}=file:open("fibo.erl",[raw,read]). {ok,{file_descriptor,prim_file,{#Port<0.538>,728}}} 65> {ok,Data}=file:read(File,filelib:file_size("fibo.erl")). {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> 0 ->\r\n case N of\r\n 1 ->1;\r\n 2 ->1;\r\n _ ->fibo(N-1)+(N-2) end."} 66> Data. "-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 -> \r\n case N of\r\n 1 ->1;\r\n 2 ->1;\r\n _ ->fibo(N-1)+(N-2) end."
当然用完关一下..file:close(File).
写文件也一样简单:
70> {ok,File}=file:open("fibo.erl",[append]). {ok,<0.121.0>} 71> file.write(File,<<"hello 你好")>). * 1: syntax error before: '.' 71> file:write(File,<<"hello 你好")>). * 1: syntax error before: ')' 71> file:write(File,<<"hello 你好">>). ok 72> file:close(File). ok
注意open的参数有很多 这边不一一列举 file模块很多操作都和平台有关.
这边还有一个方便使用的read_line/1函数:
77> file:read_line(File). {ok,"-module(fibo).\n"} 78> file:read_line(File). {ok,"-export([fibo/1]).\n"} 79> file:read_line(File). {ok,"\n"} 80> file:read_line(File). {ok,"%% fibo(1) -> 1;\n"} 81> file:read_line(File). {ok,"%% fibo(2) -> 1;\n"} 82> file:read_line(File). {ok,"%% fibo(N) -> fibo(N-1)+fibo(N-2).\n"} 83> file:read_line(File). {ok,"\n"} 84> file:read_line(File). {ok,"fibo(N) when N>0 ->\n"} 85> file:read_line(File). {ok," case N of\n"} 86> file:read_line(File). {ok," 1 ->1;\n"} 87> file:read_line(File). {ok," 2 ->1;\n"} 88> file:read_line(File). {ok," _ ->fibo(N-1)+(N-2) end."} 89> file:read_line(File). eof 90> file:read_line(File). eof
不太友好返回了个\n可以用正则处理掉 \\n$