Erlang Thursday – erl_tar:extract/1

今天的Erlang Thursday讲的是 erl_tar:extract/1

erl_tar:extract/1 有一个入参,这个入参可能是一个二进制元组、文件描述符元组或是文件名,函数把tar文件的内容解压到当前目录。

由于我们需要一个tar文件来演示解压它,那么我们来创建一些文件并将它们加入一个新的tar文件。

1
2
3
4
5
6
7
8
9
$ echo "woof" > dog.txt
$ echo "meow" > cat.txt
$ echo "sparkle" > pony.txt
$ echo 'Wocka Wocka Wocka!' > bear.txt
$ tar -cvf animal_sounds.tar dog.txt cat.txt pony.txt bear.txt
a dog.txt
a cat.txt
a pony.txt
a bear.txt

接着我们也创建一个压缩版本的tar文件。

1
2
3
4
5
$ tar -cvzf animal_sounds.tar.gz dog.txt cat.txt pony.txt bear.txt
a dog.txt
a cat.txt
a pony.txt
a bear.txt

为了测试解压这两个tar文件,我们清空当前目录的已经加入tar文件的相关文件。

`` bash
$ rm dog.txt cat.txt pony.txt bear.txt

1
2
3
4
5
6
确保我们准备好了用来试验的tar文件后,我们打开Erlang shell,然后调用 erl_tar:extract/1 函数。
``` erlang
erl_tar:extract("animal_sounds.tar").
% ok

看起来直截了当,我们回到命令行看看我们解压出来的文件。

1
2
3
$ ls dog.txt cat.txt pony.txt bear.txt
bear.txt cat.txt dog.txt pony.txt
$ rm dog.txt cat.txt pony.txt bear.txt

确认文件后,为了试验,我们把它们删除继续下面的试验。

erl_tar:extract/2

Erlang还有一个 erl_tar:extract/2 函数,它允许我们通过提供一个列表做为它第二个入参来做为解压的选项。

我们可以用 erl_tra:extract/2 解压文件并让它在控制台打印相关的信息,并且可以增加指定另外的选项,不仅打印相关信息而且解压动作不重写已经存在的任何对应的文件。

`` erlang
erl_tar:extract(“animal_sounds.tar”, [verbose]).
% x /Users/proctor/tmp/dog.txt
%
% x /Users/proctor/tmp/cat.txt
%
% x /Users/proctor/tmp/pony.txt
%
% x /Users/proctor/tmp/bear.txt
%
% ok
erl_tar:extract(“animal_sounds.tar”, [verbose, keep_old_files]).
% x /Users/proctor/tmp/dog.txt - exists, not created
%
% x /Users/proctor/tmp/cat.txt - exists, not created
%
% x /Users/proctor/tmp/pony.txt - exists, not created
%
% x /Users/proctor/tmp/bear.txt - exists, not created
%
% ok

1
2
3
4
5
接着还是回到命令行把解压出来的文件删除继续试验。
``` bash
$ rm dog.txt cat.txt pony.txt bear.txt

接下来我们通过传入有原子 compressed 组成的列表做为第二个参数来解压 animal_sounds.tar.gz。

1
2
3
4
5
6
7
8
9
10
erl_tar:extract("animal_sounds.tar.gz", [verbose, compressed, keep_old_files]).
% x /Users/proctor/tmp/dog.txt
%
% x /Users/proctor/tmp/cat.txt
%
% x /Users/proctor/tmp/pony.txt
%
% x /Users/proctor/tmp/bear.txt
%
% ok

有些时候在你的程序中处理tar文件的时候,你不想必需要在文件系统下操作所有tar里的文件而只是读取tar文件的内容,所以有一个选贤可以让tar文件内容保存在内存中

1
2
3
4
5
erl_tar:extract("animal_sounds.tar.gz", [verbose, compressed, keep_old_files, memory]).
% {ok,[{"dog.txt",<<"woofn">>},
% {"cat.txt",<<"meown">>},
% {"pony.txt",<<"sparklen">>},
% {"bear.txt",<<"Wocka Wocka Wocka!n">>}]}

当传入 memory 这个选项,erl_tar:extract/2 的返回值变为一个状态元组,其中有一个包含了被解压tar文件内每一个文件的文件名和它们的二进制内容组成的元组形成的列表。
如果一个错误在解压文件到内存的时候发生,比如我们忘了传入 compressed 选项给一个压缩tar文件,函数将返回一个错误元组。

1
2
erl_tar:extract("animal_sounds.tar.gz", [verbose, memory]).
% {error,eof}

erl_tar:extract/2 还可以接收跟多的选项,所以我强烈建议你仔细阅读官方文档获取全部可选项。

原文链接: https://www.proctor-it.com/erlang-thursday-erl_tar-extract-1/