erlang 文件操作------关于zip函数的使用
2014-12-13 00:00
232 查看
在系统管理中经常要解压,压缩日志。zip函数必不可少。在erlang中,如何使用它的库
其中,zip/3,unzip/2,list_dir/2 这三个函数是比较常用的,特别是他们的参数提供了非常好的灵活性。
2.unzip/2
unzip(Archive, Options) -> RetValue
Types:
Archive = file:name() | binary()
Options = [Option]
Option = {file_list, FileList}
| keep_old_files
| verbose
| memory
| {file_filter, FileFilter}
| {cwd, CWD}
FileList = [file:name()]
FileBinList = [{file:name(), binary()}]
FileFilter = fun((ZipFile) -> boolean())
CWD = file:filename()
ZipFile = zip_file()
RetValue = {ok, FileList}
| {ok, FileBinList}
| {error, Reason :: term()}
| {error, {Name :: file:name(), Reason :: term()}}
(摘录自eralng的文档)
来1个例子
有个压缩文件它的路径是C:\test.zip 其中有三个文件 file1_txt,file2.txt,file3,mp3
2.1 解压所有文件
2.2 只解压 file1_.txt,file.txt 文件
2.3 如何对要解压的文件做个过滤,比如只有特定后缀的文件才会解压。这个就必须要说说file_filter这个参数。
(这个参数无比强大,有了它,你会觉得,使用For结构,太浪费行数了,太丑了 )
还是原来的例子。现在,我只解压 文件名是 file1.txt 的文件
回想下文档中的定义
FileFilter = fun((ZipFile) -> boolean())
ZipFile = zip_file()
意思是这个函数的参数就是zipfile这个记录
我在贴下文档中对zipfile()的定义
zip_file() =
#zip_file{name = undefined | string(),
info = undefined | file:file_info(),
comment = undefined | string(),
offset = undefined | integer() >= 0,
comp_size = undefined | integer() >= 0}
记住这是在erlang 中被称为 record 的数据类型 。有点像结构。
这个使用这个参数后的unzip/2 函数,意思就是 解压所有,能使得这个函数能返回true 的文件,而这个函数的输入参数就是在这个压缩包里每个文件的zipfile的记录。(其实就是表明每个文件的信息的记录)
还有个知识点,我为啥
这样匹配。其实,记录这个数据类型,就是TM的一个装逼的元祖。它的一个元素就是一个表明它类型名称的atom.回到例子,我们的zip_file这个记录的类型名称就是zip_file.
3.1 有人问了你如何知道ZIP文件有啥呢 使用list_dir获取被压缩的文件的信息
它回复了所有文件消息的一个结构。接下来你就可以使用模式匹配把你要的信息挖掘出来。
例子:如何把 file1.txt(返回结果的第一个文件名,挖掘出来)
这种匹配的方法,非常简洁易懂,执行效率也很高。应付复杂的结构,这个觉得高效。
其中,zip/3,unzip/2,list_dir/2 这三个函数是比较常用的,特别是他们的参数提供了非常好的灵活性。
2.unzip/2
unzip(Archive, Options) -> RetValue
Types:
Archive = file:name() | binary()
Options = [Option]
Option = {file_list, FileList}
| keep_old_files
| verbose
| memory
| {file_filter, FileFilter}
| {cwd, CWD}
FileList = [file:name()]
FileBinList = [{file:name(), binary()}]
FileFilter = fun((ZipFile) -> boolean())
CWD = file:filename()
ZipFile = zip_file()
RetValue = {ok, FileList}
| {ok, FileBinList}
| {error, Reason :: term()}
| {error, {Name :: file:name(), Reason :: term()}}
(摘录自eralng的文档)
来1个例子
有个压缩文件它的路径是C:\test.zip 其中有三个文件 file1_txt,file2.txt,file3,mp3
2.1 解压所有文件
Dest="test.zip". zip:unzip(Dest). #{ok,["file1.txt","file2.txt","file3.mp3"]} //# 后面是shell回复的结果!!!
2.2 只解压 file1_.txt,file.txt 文件
Dest="test.zip". zip:unzip(Dest,[{file_list,["file1.txt,file2.txt]}]). #{ok,["file1.txt","file2.txt"]}
2.3 如何对要解压的文件做个过滤,比如只有特定后缀的文件才会解压。这个就必须要说说file_filter这个参数。
(这个参数无比强大,有了它,你会觉得,使用For结构,太浪费行数了,太丑了 )
还是原来的例子。现在,我只解压 文件名是 file1.txt 的文件
Dest="test.zip". zip:unzip(Dest,[{file_filter,fun(X) -> {zip_file,Name,_,_,_}=X,Name==“file1.txt” end }]). #{ok,[file1.txt]}
回想下文档中的定义
FileFilter = fun((ZipFile) -> boolean())
ZipFile = zip_file()
意思是这个函数的参数就是zipfile这个记录
我在贴下文档中对zipfile()的定义
zip_file() =
#zip_file{name = undefined | string(),
info = undefined | file:file_info(),
comment = undefined | string(),
offset = undefined | integer() >= 0,
comp_size = undefined | integer() >= 0}
记住这是在erlang 中被称为 record 的数据类型 。有点像结构。
这个使用这个参数后的unzip/2 函数,意思就是 解压所有,能使得这个函数能返回true 的文件,而这个函数的输入参数就是在这个压缩包里每个文件的zipfile的记录。(其实就是表明每个文件的信息的记录)
还有个知识点,我为啥
{zip_file,Name,_,_,_,_}=X
这样匹配。其实,记录这个数据类型,就是TM的一个装逼的元祖。它的一个元素就是一个表明它类型名称的atom.回到例子,我们的zip_file这个记录的类型名称就是zip_file.
3.1 有人问了你如何知道ZIP文件有啥呢 使用list_dir获取被压缩的文件的信息
Dest="test.zip". zip:list_dir(Dest). #{ok,[{zip_comment,[]}, {zip_file,"file1.txt", {file_info,31457284,regular,read_write, {{2014,10,21},{9,9,6}}, {{2014,10,21},{9,9,6}}, {{2014,10,21},{9,9,6}}, 54,1,0,0,0,0,0}, [],0,3211175}, {zip_file,"file2.txt", {file_info,31457288,regular,read_write, {{2014,10,21},{9,9,5}}, {{2014,10,21},{9,9,5}}, {{2014,10,21},{9,9,5}}, 54,1,0,0,0,0,0}, [],3211274,3510457} {zip_file,"file3.mp3", {file_info,31457288,regular,read_write, {{2014,10,21},{9,9,5}}, {{2014,10,21},{9,9,5}}, {{2014,10,21},{9,9,5}}, 54,1,0,0,0,0,0}, [],3211274,3510457} ]
它回复了所有文件消息的一个结构。接下来你就可以使用模式匹配把你要的信息挖掘出来。
例子:如何把 file1.txt(返回结果的第一个文件名,挖掘出来)
Dest="test.zip". {ok,_,{zip_file,Name,_,_,_,_}|_}=zip:list_dir(Dest). //_代表一个任意变量,其实就是就是占个位置,是形式使得 2边一样,否则会报匹配错误。 Name. #"file1.txt"
这种匹配的方法,非常简洁易懂,执行效率也很高。应付复杂的结构,这个觉得高效。
相关文章推荐
- java-关于文件操作-输出流的使用
- Java基础———重温关于的文件读写操作,File类,FileInputStream类等的使用
- 关于使用SHFileOperation做文件操作的问题
- 关于oracle 11.2.0.4 使用asm磁盘组条件下对应用数据表空间文件的rename alias操作
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 关于c#文件操作Streamwriter,streamreader的使用
- 关于qt在linux下使用open,write,close等文件操作的笔记
- Day29-关于类加载器在读取properties文件上的运用,轻松使用绝对路径,直接在包的根目录下进行操作
- Node[2] -- NODE中关于文件的操作 fs模块的使用
- 关于使用ODBC+VC操作DBF文件问题小结
- 关于c#文件操作Streamwriter,streamreader的使用
- 在网上找到的javascript关于文件操作的使用方法,感觉比较全面,仅作整理使用
- 关于使用LinkButton实现点击超链完成文件下载的功能
- 使用NIO来操作文件
- 网络硬盘(关于文件的操作)
- 使用Java操作二进制文件
- VB中关于文件及二进制操作的经验
- 关于delphi的log的class已经完成,一如既往的open 他delphi ,日志class,临界区,文件操作
- 关于使用sping MVC框架进行文件上传的一点感受
- 使用.NET类库操作CSV文件