首页 > 编程语言 >libarchive库笔记:tar.gz格式压缩文件编程

libarchive库笔记:tar.gz格式压缩文件编程

时间:2024-08-15 22:24:50浏览次数:13  
标签:outname tar gz 压缩文件 write entry filename archive buff

libarchive,一个支持多种格式的压缩和归档的C语言库,包含常见的tar、cpio和zcat命令行工具的实现。

本文展示一个libarchive库C语言编程的tar.gz格式压缩文件示例。

简单代码示例:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include "archive.h"
#include "archive_entry.h"

void write_archive(const char *outname, const char **filename)
{
    struct archive *a;
    struct archive_entry *entry;
    struct stat st;
    char buff[1024];
    int len;
    int fd;
    int ret;

    a = archive_write_new(); 
    archive_write_add_filter_gzip(a);
    archive_write_set_format_pax_restricted(a);
    archive_write_open_filename(a, outname);
    while (*filename) {
        stat(*filename, &st);
        entry = archive_entry_new();
        archive_entry_copy_pathname(entry, *filename);
        archive_entry_set_mtime(entry, st.st_mtime, 0);
        archive_entry_set_size(entry, st.st_size);
        archive_entry_set_filetype(entry, AE_IFREG);
        archive_entry_set_perm(entry, 0644);
        ret = archive_write_header(a, entry);
        if (ARCHIVE_OK != ret) {
			printf("archive_write_header errno:%d, errstr:%s\n", 
                    archive_errno(a), archive_error_string(a));
		}
        fd = open(*filename, O_RDONLY);
        memset(buff, 0, sizeof(buff));
        len = read(fd, buff, sizeof(buff));
        while ( len > 0 ) {
            archive_write_data(a, buff, len);
            memset(buff, 0, sizeof(buff));
            len = read(fd, buff, sizeof(buff));
        }
        close(fd);
        archive_entry_free(entry);
        filename++;
    }
    archive_write_close(a);
    archive_write_free(a);
}

int main(int argc, char *argv[])
{
	const char *outname;

	if (argc < 3) {
		printf("[usage] %s [outname] [filename]\n", argv[0]);
		printf("example: %s [dst].tar.gz [src]\n", argv[0]);
		return 0;
	}
	
	argv++;
	outname = *argv++;
	write_archive(outname, (const char**)argv);
	return 0;
}

其中,write_archive()函数的输入参数outname是压缩后的tar.gz文件,输入参数filename是需要被压缩的文件。

编译运行:

GCC编译时加-larchive参数,编译示例如下:

gcc -o main main.c -larchive

运行示例如下图,将生成的tar.gz压缩文件解压后,比较源文件和解压文件的MD5值,结果是一致的。

使用hexdump命令查看该压缩包的文件头,值为0x1f8b 0800,与tar.gz文件头一致。


备注:压缩要注意的一点,程序运行空间是否充足。

标签:outname,tar,gz,压缩文件,write,entry,filename,archive,buff
From: https://blog.csdn.net/starlight_0/article/details/141109695

相关文章

  • js 字符操作 padStart padEnd 使用教程
    padStart和padEnd是JavaScript中字符串方法,用于在字符串的开头或结尾添加填充字符,直到达到指定的长度。padStart(targetLength,padString)targetLength:目标字符串长度。padString:用于填充的字符串。用法:conststr="hello";//在字符串开头添加空格,直到长度为......
  • js 字符操作startswidth 方法使用
    startswidth用于检查字符串是否以指定的子字符串开头。startsWith(searchString,position)searchString:要搜索的子字符串。position:可选参数,指定搜索开始的位置(默认值为0)。用法:conststr="helloworld";//检查字符串是否以"hello"开头conststartsWithHello......
  • Target Encoding(目标编码)
    TargetEncoding(目标编码),这是一种强大的特征编码技术,特别适用于处理高基数分类变量。基本原理:TargetEncoding的核心思想是用目标变量的平均值来替换分类变量的每个类别。这种方法试图捕捉每个类别与目标变量之间的关系。工作方式:对于分类变量的每个类别,计算该类别对应的目......
  • 38k Star!颠覆传统BI,Metabase新一代智能数据分析工具
    Metabase是一个开源的商业智能(BI)工具,帮助用户轻松地从数据库中提取数据,并将其转化为易于理解的图表和仪表板。与传统的BI工具相比,Metabase不需要用户具备编写SQL的能力,非技术人员也能通过简单的操作创建有用的报告和可视化数据分析。Metabase主要特性部署便捷:比传统的......
  • 自定义Starter
    pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://mave......
  • osg,objectarx及occt之间矩阵的转换
    osg的矩阵表达形式为osg::MatrixObjectArx的矩阵表达式为AcGeMatrix3docct的矩阵表达式分gp_Trsf及支持变形的gp_GTrsf osg矩阵转化为ObjectArxosg::MatrixmVPW;TcGeMatrix3dmatrix;for(inti=0;i<4;++i){for(intj=0;j<4;++j){matr......
  • Taro——Error: Can't resolve '@/api/xxx'
    前言在使用@去import的时候,报错提示不能够载入,看了下tsconfig.json已经配置了paths,所以考虑是不是taro本身上还有些配置没有完善,查询taro文档后解决;taro版本:3.6.34alias:https://docs.taro.zone/docs/config-detail#alias内容config在配置文件config/index.ts中的config中......
  • Taro——环境变量配置
    前言最近准备开发移动端相关的内容,调研后选择了Taro,基于Taro+Vue3进行开发,在初始化框架后,又加入了一些前端规范限制,都完成后,打算配置环境变量,却发现按着官方的文档去配置,并没有生效;在封装的axios中去使用的使用,获取到的是undefined,所以这里做下记录;taro版本:3.6.34模式和环境变......
  • 3台服务器+StarVCenter搭建 “超融合云平台” --完美体验跑100台虚拟机
    我们通常讲的“超融合(HCI)”是一种云平台基础架构方案,它无需专用的存储设备,每台服务器既承担计算又存储数据,只需增加服务器,即可等效提升计算+存储性能。是性能最强、性价比最高的一种方案。本文将介绍搭建超融合云平台,并且平滑替代Vmware虚拟化的详细方案,以StarVCenter超融合软......
  • StarNet:关于 Element-wise Multiplication 的高性能解释研究 | CVPR 2024
    论文揭示了staroperation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力。基于此提出了StarNet,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟来源:晓飞的算法工程笔记公众号论文:RewritetheStars论文地址:https://arxiv.org/abs/240......