文档章节

erlang 文件操作------关于zip函数的使用

编码术士
 编码术士
发布于 2014/12/13 22:09
字数 799
阅读 73
收藏 0

在系统管理中经常要解压,压缩日志。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 解压所有文件

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"


这种匹配的方法,非常简洁易懂,执行效率也很高。应付复杂的结构,这个觉得高效。

© 著作权归作者所有

编码术士
粉丝 0
博文 6
码字总数 1930
作品 0
海淀
程序员
私信 提问
elixir官方入门教程 Erlang库

Erlang库 二进制模块 格式化文本输出 加密模块 图片模块 Erlang长期存储 数学模块 队列模块 随机模块 压缩模块 Elixir提供了与Erlang库优秀的互用性.事实上,Elixir不鼓励简单地包装Erlang库,...

ljzn
2016/08/06
59
0
用 Elixir 的一周

大约一周前我开始学习Elixir. 关于这个我也只是有些模糊的印象但还没有仔细去看。 但在Dave Thomas 出版了 Programming Elixir之后一切都发生了改变. Dave Thomas 帮我修订过Erlang这本书并且...

dbtop
2014/03/18
3.2K
3
5.编译并运行erlang程序

1.停止erlang系统方法: ctrl+C(Windows下 ctrl+Break). 不可控关闭BIF函数: erlang:halt() 强制停止系统(小瑕疵:对于大型的数据库操作程序,可能在下次需要进行一些回复操作) 可控关闭:q...

sinpo
2012/02/29
0
0
OTP 21.2 发布,Erlang 编写的应用服务器

OTP 21.2 发布了,OTP (Open Telecom Platform) 是一个用 Erlang 编写的应用服务器,它是一套 Erlang 库,由 Erlang 运行时系统、主要使用 Erlang 编写的许多随时可用的组件以及 Erlang 程序...

h4cd
2018/12/13
0
1
erlang-基本语法_2、模块和函数、内置函数、在erlang shell中运行文件

写在前面 本文主要是以一个erlang的学习记录,有错误的地方欢迎指正。 模块和函数 1、Erlang 里代码是用 Module 组织的。一个 Module 包含了一组功能相近的函数。用一个函数的时候,要这么调...

橄榄工作室
2018/06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ubuntu 安装zoom

之前ubuntu安装zoom失败了,也没管。后来安装其他软件报出依赖错误,由于zoom安装失败导致其他并不想干的安装出错。 pvc@pvc-Vostro-3650:~$ sudo apt-get install libnet1-dev 正在读取软件...

琴麻岛
6分钟前
0
0
Spring Boot项目每次请求Session都不一样的记录

背景 网站注册模块有个带图片验证码验证的环节,实现思路为:前端请求获取图片验证码的接口,接口里生成图片验证码,并保存在session;验证图片验证码时,从session中获取图片验证码与当前请...

豫华商
7分钟前
0
0
Azure Monitor现可一次监控整个虚拟机扩展集

Azure Monitor现在可以用来分析以及监控虚拟机扩展集(Scale Set)的健康程度以及效能,支持的操作系统包含Windows和Linux,目前这项功能仍在公开预览阶段。虚拟机扩展集指的是由Azure VM Sc...

kocker
11分钟前
0
0
上篇:《对于HashMap,你知道多少?》

阅读目录 一、前言 二、源码解读 三、并发场景中使用HashMap会怎么样? 四、怎样合理使用HashMap? 一、前言 HashMap在面试中是个火热的话题,那么你能应付自如吗?下面抛出几个问题看你是否知...

Java干货分享
15分钟前
0
0
突破!阿里云CDN实现毫秒级全网刷新

通常在某网站使用了CDN节点来实现内容分发加速后,当源站内容更新的时候,CDN刷新系统会通过提交刷新请求将CDN节点上的指定缓存内容强制过期。当用户访问的时候,CDN节点将回源获取最新内容返...

zhaowei121
17分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部