如何从压缩包中提取单个文件

[复制链接]
查看11 | 回复10 | 2021-1-27 06:45:11 | 显示全部楼层 |阅读模式
假设我有一个压缩包,格式为tar.gz。压缩包比较大,在不解压缩的前提下,我现在想从这个压缩包中提取指定的文件,使用实现的语言为C++或C语言。系统为红旗linux。类似的在命令行中可以通过tar和grep命令结合使用实现。请问如果利用接口函数来实现应该怎么操作。希望能把思路简单的说一下,如果能提供一个简单的例子就更好了。在网上找了一下,没有找到理想的答案,希望在此得到满意的答复。

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:45:11 | 显示全部楼层
无论什么语言,都是zlib库解压掉gzip.
我只会用PHP写,C的zlib库难用,而且tar库也懒得找。
所有可行代码列表如下:
-rw-r--r--.1rootroot840719May1222:51libevent.tar.gz
以上是源文件。
tar-tvflibevent.tar.gz,看到内部的文件列表是:
-rw-r--r--500/50025442012-02-1017:17libevent-2.0.18-stable/evsignal-internal.h
-rw-r--r--500/50085342012-02-1017:17libevent-2.0.18-stable/evthread_win32.c
-rw-r--r--500/50088152012-02-1017:17libevent-2.0.18-stable/bufferevent_pair.c
-rw-r--r--500/50079672012-02-1017:17libevent-2.0.18-stable/poll.c
-rw-r--r--500/50050992012-02-1017:17libevent-2.0.18-stable/log.c
我希望抽取其中的log.c。
代码必须先解压缩gzip,之后直接抽取tar包中的libevent-2.0.18-stable/log.c这个文件。
代码如下:
[User:rootTime:23:24:06Path:/home/liangdong/php]$catgzip.php
extractList($files,'./files')){
echo"sucessfulextract".PHP_EOL;
}
?>
执行完成后,将在目录下看见以下文件,说明成功:
-rw-r--r--.1rootroot3655680May1223:22libevent.tar
-rw-r--r--.1rootroot840719May1222:51libevent.tar.gz
drwxr-xr-x.3rootroot4096May1223:22files
tar包是gzip解压后的内容,files是抽取tar.gz中log.c文件的存储目录,files内部如下:
-rw-r--r--.1rootroot5099Feb1017:17log.c
[User:rootTime:23:27:06Path:/home/liangdong/php/files/libevent-2.0.18-stable]$
可以看到抽取的Log.c。
回复

使用道具 举报

千问 | 2021-1-27 06:45:11 | 显示全部楼层
楼上的意思是先解压,然后可以直接通过文件名提取?多谢指教,我也研究一下zlib库。
回复

使用道具 举报

千问 | 2021-1-27 06:45:11 | 显示全部楼层
引用2楼的回复:楼上的意思是先解压,然后可以直接通过文件名提取?多谢指教,我也研究一下zlib库。
是的,你看代码应该能看懂吧,都是英文。
回复

使用道具 举报

千问 | 2021-1-27 06:45:11 | 显示全部楼层
看了一下zlib库,貌似没有发现可以直接通过文件名来提取文件的接口啊。现在问题的关键是将压缩文件解压到buff里面的时候,如何获得我所要提取的文件的那部分内容?在网上搜索了一下,仍然没有找到满意的答案。
回复

使用道具 举报

千问 | 2021-1-27 06:45:11 | 显示全部楼层
一步一步做,不是都告诉你了吗,先解压成tar,再抽取tar中文件,之后再打开文件找指定内容。
回复

使用道具 举报

千问 | 2021-1-27 06:45:11 | 显示全部楼层
将压缩文件解压打开后,是如何找到指定的内容的呢?是否有通过文件名来获取文件内容的接口函数?本人刚接触这方面知识,不甚了解。
回复

使用道具 举报

千问 | 2021-1-27 06:45:11 | 显示全部楼层
引用6楼的回复:将压缩文件解压打开后,是如何找到指定的内容的呢?是否有通过文件名来获取文件内容的接口函数?本人刚接触这方面知识,不甚了解。
你是希望直接对一个tar.gz找某一个内容,还是从tar.gz中找一个文件,还是怎么样。。
回复

使用道具 举报

千问 | 2021-1-27 06:45:11 | 显示全部楼层
就是从压缩包中找到指定需要的文件(文件的名字知道),然后把它单独提取出来。表述不清,请谅解。例如:我的压缩包里面有file1.cpp,file2.xml,file3.h....,现在我想提取file2.xml。
回复

使用道具 举报

千问 | 2021-1-27 06:45:11 | 显示全部楼层
引用1楼的回复:无论什么语言,都是zlib库解压掉gzip.
我只会用PHP写,C的zlib库难用,而且tar库也懒得找。
所有可行代码列表如下:
-rw-r--r--.1rootroot840719May1222:51libevent.tar.gz
以上是源文件。
tar-tvflibevent.tar.gz,看到内部的文件列表是:
……

这个代码就是啊,抽取Log.c文件啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行