zip
zip
模块
zip
模块摘要
用于阅读和创建“zip”档案的实用程序。
描述
该模块存档和提取文件到zip存档和从zip存档提取文件。zip格式由PKWARE网站上的“ZIP Appnote.txt”文件指定www.pkware.com
。
该zip模块支持高达6.1的zip存档版本。但是,不支持密码保护和Zip64。
按照惯例,压缩文件的名称将以.zip
。结束。遵守惯例,添加.zip
到文件名。
- 要创建zip档案,请使用功能
zip/2
或zip/3
。它们也可以create/2,3
用来erl_tar
模拟模块。
- 若要从zip归档文件中提取文件,请使用函数
unzip/1
或unzip/2
.它们也可作为extract/1,2
,类似于erl_tar
模块。
- 要折叠zip存档中所有文件的功能,请使用函数
foldl/3
。
- 若要返回zip存档中的文件列表,请使用函数
list_dir/1
或list_dir/2
.它们也可作为table/1,2
,类似于erl_tar
模块。
- 要将文件列表打印到Erlang shell,请使用函数
t/1
或tt/1
。
- 有时候需要打开一个zip压缩文件,并按文件解压缩文件,而不必重新打开压缩文件。这可以通过函数来完成
zip_open/1,2
,zip_get/1,2
,zip_list_dir/1
,和zip_close/1
。
局限性
- 不支持Zip 64档案。
- 不支持密码保护和加密档案。
- 仅支持DEFLATE(zlib压缩)和STORE(未压缩数据)zip方法。
- 存档大小限制为2 GB(32位)。
- 在创建zip档案时,不支持单个文件的注释。支持整个zip归档的zip归档注释。
- 不支持更改zip存档。要从存档中添加或删除文件,必须重新创建整个归档文件。
数据类型
zip_comment() = #zip_comment{comment = string()}
记录zip_comment
只包含zip归档的归档注释。
zip_file() =
#zip_file{name = string(),
info = file:file_info(),
comment = string(),
offset = integer() >= 0,
comp_size = integer() >= 0}
记录zip_file
包含以下字段:
name
文件名
info
文件信息,如file:read_file_info/1
内核
comment
zip存档中文件的注释
offset
zip压缩文件中的文件偏移量(内部使用)
comp_size
压缩文件的大小(找到未压缩文件的大小info
)
filename() = file:filename()
压缩文件的名称。
extension() = string()
extension_spec() =
all |
[
extension()
] |
{add, [
extension()
]} |
{del, [
extension()
]}
create_option() =
memory |
cooked |
verbose |
{comment, string()} |
{cwd, file:filename()} |
{compress,
extension_spec()
} |
{uncompress,
extension_spec()
}
这些选项在create/3
中描述
handle()
由.zip_open/2
返回
输出
foldl(Fun, Acc0, Archive) -> {ok, Acc1} | {error, Reason}
类型
调用存档中连续文件的乐趣(FileInArchive,GetInfo,GetBin,AccIn),以AccIn == Acc0开头。
FileInArchive
是文件在档案中的名称。
GetInfo
返回有关文件的信息的乐趣。
GetBin
返回文件内容。
必须在Fun中调用GetInfo和GetBin。 他们的行为是不确定的,如果他们被称为乐趣的上下文之外。
Fun必须返回一个新的累加器,并将其传递给下一个呼叫。 foldl / 3返回最终的累加器值。 如果存档为空,则返回Acc0。 不必遍历归档中的所有文件。 迭代可以通过抛出异常以受控方式过早结束。
例子:
> Name = "dummy.zip".
"dummy.zip"
> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]).
{ok,{"dummy.zip",
<<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
0,0,3,0,0,...>>}}
> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}).
{ok,[{"bar",<<"BAR">>,
{file_info,3,regular,read_write,
{{2010,3,1},{19,2,10}},
{{2010,3,1},{19,2,10}},
{{2010,3,1},{19,2,10}},
54,1,0,0,0,0,0}},
{"foo",<<"FOO">>,
{file_info,3,regular,read_write,
{{2010,3,1},{19,2,10}},
{{2010,3,1},{19,2,10}},
{{2010,3,1},{19,2,10}},
54,1,0,0,0,0,0}}]}
> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]).
{ok,{"dummy.zip",
<<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
0,0,3,0,0,...>>}}
> catch zip:foldl(fun("foo", _, B, _) -> throw(B() (_,_,_,Acc) -> Acc end, [], {Name, Bin}).
<<"FOO">>
list_dir(Archive) -> RetValue
list_dir(Archive, Options) -> RetValue
table(Archive) -> RetValue
table(Archive, Options) -> RetValue
类型
list_dir/1
检索zip存档中的所有文件名Archive
。
list_dir/2
提供选项。
table/1
和table/2
作为同义词提供,以类似于erl_tar
模块。
结果值是元组{ok, List}
,其中List
包含zip归档注释作为第一个元素。
有一种选择:
cooked
默认情况下,此函数以raw
模式打开zip文件,速度更快但不允许使用远程(Erlang)文件服务器。添加cooked
到模式列表将覆盖默认值,并打开不带选项的zip文件raw
。
t(Archive) -> ok
类型
将zip存档Archive
中的所有文件名打印到Erlang shell。(类似于tar t
)
tt(Archive) -> ok
类型
将zip文件中的所有文件的文件名和信息打印Archive
到Erlang shell。(类似于tar tv
)
unzip(Archive) -> RetValue
unzip(Archive, Options) -> RetValue
extract(Archive) -> RetValue
extract(Archive, Options) -> RetValue
类型
unzip/1
从压缩存档中提取所有文件。
unzip/2
提供提取某些文件的选项,等等。
extract/1
并extract/2
作为模块的同义词提供erl_tar
。
如果将参数Archive
指定为二进制文件,则二进制文件的内容被假定为zip存档文件,否则为文件名。
备选方案:
{file_list, FileList}
默认情况下,所有文件都从zip压缩文件中提取。使用选项{file_list, FileList}
,功能unzip/2
只会提取名称包含在其中的文件FileList
。必须指定完整路径,包括zip存档中所有子目录的名称。
cooked
默认情况下,此函数以raw
模式打开zip文件,速度更快但不允许使用远程(Erlang)文件服务器。添加cooked
到模式列表将覆盖默认值,并打开不带选项的zip文件raw
。这同样适用于提取的文件。
keep_old_files
默认情况下,所有与zip压缩文件中的文件名称相同的文件都将被覆盖。使用选项keep_old_files
设置,功能unzip/2
不会覆盖现有文件。请注意,即使memory
指定了选项,也就是说没有文件被覆盖,现有文件将从结果中排除。
verbose
为每个提取的文件打印一条信息消息。
memory
取而代之的是提取到当前目录,结果是以元组列表的形式给出的{Filename, Binary}
,其中Binary
是一个二进制文件,其中包含Filename
zip 文件中提取的文件数据。
{cwd, CWD}
使用指定的目录作为当前目录。当从zip压缩文件中提取文件名时,它会预设为文件名。(像file:set_cwd/1
Kernel 一样行事,但不改变全局cwd
属性。)
zip(Name, FileList) -> RetValue
zip(Name, FileList, Options) -> RetValue
create(Name, FileList) -> RetValue
create(Name, FileList, Options) -> RetValue
类型
创建一个包含在中指定的文件的zip存档FileList
。
create/2
与create/3
作为模块的同义词提供erl_tar
。
FileList
是一个文件列表,其中包含与当前目录相关的路径,这些路径与该路径一起存储在归档中。还可以使用二进制文件中的数据指定文件以直接从数据创建归档。
如“Appnote.txt”文件中所述,文件使用DEFLATE压缩进行压缩。但是,如果文件已经被压缩,文件将被存储而不压缩。zip/2
并zip/3
检查文件扩展名以确定文件是否未经压缩存储。具有以下扩展名的文件不会被压缩:.Z
,.zip
,.zoo
,.arc
,.lzh
,.arj
。
可以覆盖默认行为并通过使用选项{compress, What}
和控制要压缩的文件类型{uncompress, What}
。也可以使用许多compress
和uncompress
选项。
要触发文件压缩,其扩展名必须与compress
条件匹配并且不得与uncompress
条件匹配。例如,如果compress
设置为["gif", "jpg"]
并且uncompress
设置为["jpg"]
,则仅"gif"
压缩具有扩展名的文件。
备选方案:
cooked
默认情况下,此函数以模式打开zip文件,raw
速度更快但不允许使用远程(Erlang)文件服务器。添加cooked
到模式列表将覆盖默认值,并在没有raw
选项的情况下打开zip文件。这同样适用于添加的文件。
verbose
打印有关每个添加的文件的信息消息。
memory
输出不是到一个文件,而是作为一个元组{FileName, binary()}
。这个二进制文件是一个带有标题的完整的zip压缩文件,例如可以提取unzip/2
。
{comment, Comment}
将注释添加到zip存档中。
{cwd, CWD}
将指定的目录用作当前工作目录(cwd
)。这被添加到文件名前,尽管不在zip文件中(就像file:set_cwd/1
在Kernel中一样,但不改变全局cwd
属性)。
{compress, What}
控制要压缩的文件类型。默认为all
。以下值What
是允许的:
all
所有文件都被压缩(只要它们通过了uncompress
条件)。
[Extension]
只有具有这些扩展名的文件才会被压缩。
{add,[Extension]}
将这些扩展添加到压缩扩展列表中。
{del,[Extension]}
从压缩扩展列表中删除这些扩展。
**`{uncompress, What}`**
控制要解压缩的文件类型。默认为[".Z", ".zip", ".zoo", ".arc", ".lzh", ".arj"]
。以下值What
是允许的:
all
没有文件被压缩。
[Extension]
具有这些扩展名的文件将被解压缩。
{add,[Extension]}
将这些扩展添加到解压缩扩展列表中。
{del,[Extension]}
从解压缩扩展列表中删除这些扩展。
zip_close(ZipHandle) -> ok | {error, einval}
类型
关闭一个zip存档,以前是用zip_open/1,2
关闭所有资源,关闭后不使用句柄。
zip_get(ZipHandle) -> {ok, Result} | {error, Reason}
zip_get(FileName, ZipHandle) -> {ok, Result} | {error, Reason}
类型
从打开的存档中提取一个或所有文件。
这些文件被解压缩到内存或文件,具体取决于在zip_open/1,2
打开压缩文件时指定的功能选项。
zip_list_dir(ZipHandle) -> {ok, Result} | {error, Reason}
类型
返回打开的zip存档的文件列表。第一个返回的元素是zip归档注释。
zip_open(Archive) -> {ok, ZipHandle} | {error, Reason}
zip_open(Archive, Options) -> {ok, ZipHandle} | {error, Reason}
类型
打开一个zip存档,并读取并保存其目录。这意味着稍后从存档中读取文件比一次一个地解压缩文件更快unzip/1,2
。
档案必须关闭zip_close/1
。
该ZipHandle
如果最初打开了档案文件的进程关闭。