在线文档教程
Erlang 20

zip

zip

模块

zip

模块摘要

用于阅读和创建“zip”档案的实用程序。

描述

该模块存档和提取文件到zip存档和从zip存档提取文件。zip格式由PKWARE网站上的“ZIP Appnote.txt”文件指定www.pkware.com

该zip模块支持高达6.1的zip存档版本。但是,不支持密码保护和Zip64。

按照惯例,压缩文件的名称将以.zip。结束。遵守惯例,添加.zip到文件名。

  • 要创建zip档案,请使用功能zip/2zip/3。它们也可以create/2,3用来erl_tar模拟模块。

  • 若要从zip归档文件中提取文件,请使用函数unzip/1unzip/2.它们也可作为extract/1,2,类似于erl_tar模块。

  • 要折叠zip存档中所有文件的功能,请使用函数foldl/3

  • 若要返回zip存档中的文件列表,请使用函数list_dir/1list_dir/2.它们也可作为table/1,2,类似于erl_tar模块。

  • 要将文件列表打印到Erlang shell,请使用函数t/1tt/1

  • 有时候需要打开一个zip压缩文件,并按文件解压缩文件,而不必重新打开压缩文件。这可以通过函数来完成zip_open/1,2zip_get/1,2zip_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/1table/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/1extract/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是一个二进制文件,其中包含Filenamezip 文件中提取的文件数据。

{cwd, CWD}

使用指定的目录作为当前目录。当从zip压缩文件中提取文件名时,它会预设为文件名。(像file:set_cwd/1Kernel 一样行事,但不改变全局cwd属性。)

zip(Name, FileList) -> RetValue

zip(Name, FileList, Options) -> RetValue

create(Name, FileList) -> RetValue

create(Name, FileList, Options) -> RetValue

类型

创建一个包含在中指定的文件的zip存档FileList

create/2create/3作为模块的同义词提供erl_tar

FileList是一个文件列表,其中包含与当前目录相关的路径,这些路径与该路径一起存储在归档中。还可以使用二进制文件中的数据指定文件以直接从数据创建归档。

如“Appnote.txt”文件中所述,文件使用DEFLATE压缩进行压缩。但是,如果文件已经被压缩,文件将被存储而不压缩。zip/2zip/3检查文件扩展名以确定文件是否未经压缩存储。具有以下扩展名的文件不会被压缩:.Z.zip.zoo.arc.lzh.arj

可以覆盖默认行为并通过使用选项{compress, What}和控制要压缩的文件类型{uncompress, What}。也可以使用许多compressuncompress选项。

要触发文件压缩,其扩展名必须与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如果最初打开了档案文件的进程关闭。