libtar和libz实现.tar.gz压缩

1.程序代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define FILE_PATH_LEN 128

int compress_dir(char *src_dir, char *tar_file)
{
        TAR *tar;
        char *extract = ".";
        char dest_file[FILE_PATH_LEN];
        char buffer[4096];
        ssize_t read_len;
        FILE *p_tar_fd;
        gzFile p_gz_fd;

        memset(dest_file, 0x00, sizeof(dest_file));
        memset(buffer, 0x00, sizeof(buffer));

        sprintf(dest_file, "%s.gz", tar_file);

        if(tar_open(&tar, tar_file, NULL, O_WRONLY|O_CREAT, 0644, TAR_GNU) < 0)
        {
                printf("tar open [%s] error!\n", tar_file);
                return -1;
        }

        if(tar_append_tree(tar, src_dir, extract) < 0)
        {
                close(tar_fd(tar));
                printf("tar append tree [%s] error!\n", tar_file);
                return -1;
        }

        close(tar_fd(tar));

        p_tar_fd = fopen(tar_file, "rb");
        if(p_tar_fd == NULL)
        {
                printf("fopen %s error!\n", tar_file);
                return -1;
        }

        p_gz_fd = gzopen(dest_file, "wb");
        if(p_gz_fd == NULL)
        {
                fclose(p_tar_fd);
                remove(tar_file);
                printf("gzopen %s error!\n", dest_file);
                return -1;
        }

        while((read_len = fread(buffer, 1, sizeof(buffer), p_tar_fd)) > 0)
        {
                gzwrite(p_gz_fd, buffer, read_len);
                memset(buffer, 0x00, sizeof(buffer));
        }

        gzclose(p_gz_fd);

        fclose(p_tar_fd);

        remove(tar_file);

        return 0;
}

int main(int argc, char **argv)
{
        char file_name[101];
        char tar_file_name[111];

        if(argc != 2)
                return -1;

        memset(file_name, 0x00, sizeof(file_name));
        memset(tar_file_name, 0x00, sizeof(tar_file_name));

        strncpy(file_name, argv[1], 100);
        sprintf(tar_file_name, "%s.tar", file_name);

        //printf("%s %s\n", file_name, tar_file_name);

        compress_dir(file_name, tar_file_name);

        return 0;
}

2.编译代码

$ gcc -o targz targz.c -I$HOME/local/include/ -ltar -lz

3.运行程序

$ ./targz test

你可能感兴趣的:(libtar和libz实现.tar.gz压缩)