libtar 和 libz 的使用


libtar 和 libz 的使用

用c代碼生成 tar.gz 文件  實現的功能和 tar -zcf 命令一樣

大概流程為
1、先用libtar相關函數對某個目錄生成tar文件
2、然后對tar文件進行壓縮

//tarFile  -- like /home/user/test.tar
int tb_comparss_dir(charsrcDirchartarFile)
{
    TAR            *pTar;
    char        extractTo[] = ".";
    char        desFile[FILE_PATH_LEN] = { 0 };
    char        szBuf[10000] = { 0 };
    ssize_t        read_len;
    FILE*        tarFd;
    gzFile        gzFd;
    memset(desFile, 0, sizeof(desFile));
    sprintf(desFile"%s.gz"tarFile);
    if (tar_open(&pTartarFileNULL, O_WRONLY | O_CREAT, 0644, TAR_GNU) < 0)
    {
        xlog_error(__FILE____LINE__"tar_open[%s] error[%s]"tarFilestrerror(errno));
        return -1;
    }
    if (tar_append_tree(pTarsrcDirextractTo) < 0)
    {
        close(tar_fd(pTar));
        xlog_error(__FILE____LINE__"tar_append_tree error[%s]"strerror(errno));
        return -1;
    }
    close(tar_fd(pTar));
    tarFd = fopen(tarFile"rb");
    if (tarFd == NULL) {
        xlog_error(__FILE____LINE__"fopen[%s] error[%s]"tarFilestrerror(errno));
        return -1;
    }
    gzFd = gzopen(desFile"wb");
    if (gzFd == NULL) {
        fclose(tarFd);
        remove(tarFile);
        fprintf(stderr"gzopen error\n");
        xlog_error(__FILE____LINE__"gzopen[%s] error[%s]"tarFilestrerror(errno));
        return -1;
    }
    while ((read_len = fread(szBuf, 1, 10000, tarFd)) > 0)
    {
        gzwrite(gzFdszBufread_len);
    }
    gzclose(gzFd);
    fclose(tarFd);
    remove(tarFile);
    return 0;
}  


以上代碼進行壓縮某個目錄,參數srcDir為要打包壓縮的某個目錄,tarFile 為要打包的文件名(.tar 結尾) 生成的文件最后未.tar.gz


解壓縮和壓縮過程相反,先解壓,再解包

//uncomparss to srcDir
int tb_uncomparss_dir(charsrcDirchartarFile)
{
    gzFile        gzFd;
    char        szTmpFile[FILE_PATH_LEN] = { 0 };
    FILE        *fp;
    int            nReadLen = 0;
    char        szBuf[10000] = { 0 };
    TAR*        pTar;
    if (strstr(tarFile"tar.gz") == NULL)
    {
        xlog_error(__FILE____LINE__"file[%s] is not end with .tar.gz"tarFile);
        return -1;
    }
    if (access(tarFile, F_OK) < 0)
    {
        xlog_error(__FILE____LINE__"not find file[%s]"tarFile);
        return -1;
    }
    gzFd = gzopen(tarFile"rb");
    if (gzFd == NULL)
    {
        xlog_error(__FILE____LINE__"gzopen file[%s] err[%s]"tarFilestrerror(errno));
        return -1;
    }
    memset(szTmpFile, 0, sizeof(szTmpFile));
    memcpy(szTmpFiletarFilestrlen(tarFile) - 3);        //remove .gz
    fp = fopen(szTmpFile"wb");
    if (fp == NULL)
    {
        gzclose(gzFd);
        xlog_error(__FILE____LINE__"open file[%s] err[%s]"szTmpFilestrerror(errno));
        return -1;
    }
    while ((nReadLen = gzread(gzFdszBuf, 10000)) > 0)
    {
        fwrite(szBufnReadLen, 1, fp);
    }
    gzclose(gzFd);
    fclose(fp);
    if (tar_open(&pTarszTmpFileNULL, O_RDONLY, 0644, TAR_GNU) < 0)
    {
        unlink(szTmpFile);
        xlog_error(__FILE____LINE__"tar_open[%s] error[%s]"szTmpFilestrerror(errno));
        return -1;
    }
    if (tar_extract_all(pTarsrcDir) < 0)
    {
        tar_close(pTar);
        unlink(szTmpFile);
        xlog_error(__FILE____LINE__"tar_extract_all error[%s]"strerror(errno));
        return -1;
    }
    tar_close(pTar);
    unlink(szTmpFile);
    return 0;
}  


請主動忽略 xlog_error()函數
其中makefile 中需要添加動態庫   -ltar  -lz  
libtar.so 可以用yum安裝 libtar-devel 這個





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM