当前位置: 首页 > 知识库问答 >
问题:

libtar c提取文件

松飞翮
2023-03-14

操作系统

完全是新手问题,但我自己也不明白。我使用的是http://www.feep.net/libtar/的libtar

我已经zlib'ed了几个文件,并通过libtar进行了焦油化。

TAR *pTar;
snprintf(tar_name,sizeof(tar_name),"%s.tar",BACKUP_TASK.path_to_backup);
tar_open(&pTar, tar_name, NULL, O_WRONLY | O_CREAT, 0777, TAR_GNU);
tar_append_tree(pTar, BACKUP_TASK.path_to_backup, BACKUP_TASK.task_name);
//Append vm list to archive
tar_append_file(pTar, "task.xml", "backup.xml");
//Close it
tar_close(pTar);

然后我需要寻找tar,提取一些文件

以下是焦油的真实含量:

 #tar tf /home/backup/ftp_templates.tar 

 ftp_templates/
 ftp_templates/d982d6cc-810a-7582-ddec-2c6b6a9d5530.xva.zlib
 ftp_templates/51979771-7362-2061-9043-3606682fa0f3.xva.zlib
 ftp_templates/f9e5a919-4aa9-a02d-b1ec-3667ecaa4a5b.xva.zlib
 backup.xml

我试图列出里面的文件:

TAR *pTar;
char *tarFilename = "/home/backup/ftp_templates.tar";
tar_open(&pTar, tarFilename, NULL, O_RDONLY | TAR_NOOVERWRITE, 0777, TAR_GNU|TAR_VERBOSE);
while(th_read(pTar)==0)
{
    puts(pTar->th_buf.name);
}
tar_close(pTar);

但它只给

ftp_templates/
ftp_templates/d982d6cc-810a-7582-ddec-2c6b6a9d5530.xva.zlib

也如果我尝试提取任何文件

tar_extract_file(pTar,"backup.xml");

它创建空文件,大小为0

提取所有文件效果很好。我只是没有找到任何提取单个文件的例子....

tar-xvf/home/backup/ftp_templates。tar backup.xml

这也做得很好,所以焦油本身是可以的。

共有2个答案

杜苏燕
2023-03-14

如果您想查找许多文件,请先构建tar的索引:

#include <iostream>
#include <string>
#include <vector>
#include <libtar.h>
#include <fcntl.h>
#include <unistd.h>
using namespace std;

int extract_from_tar(TAR *pTar, const vector<tar_header> &fileList, 
    const vector<long int> &fileInPos, size_t index)
{
    const tar_header &th = fileList[index];
    pTar->th_buf = th;
    lseek (tar_fd(pTar), fileInPos[index], SEEK_SET);

    return tar_extract_regfile(pTar, pTar->th_buf.name);
}

int main()
{
    time_t seed = time( NULL );
    srand( seed );

    vector<tar_header> fileList;
    vector<long int> fileInPos;
    TAR *pTar = nullptr;
    tar_open(&pTar, "test.tar", NULL, O_RDONLY, 0, 0);

    //Build index for quick access
    int i=0;    
    while ((i = th_read(pTar)) == 0)
    {
        if(TH_ISREG(pTar))
        {
            fileList.push_back(pTar->th_buf);
            long fd = tar_fd(pTar);
            long int pos = lseek(fd, 0, SEEK_CUR);

            fileInPos.push_back(pos);
            if (tar_skip_regfile(pTar) != 0) return -1;
        }
    }

    //Extract a random file from archive
    if(fileList.size()>0)
        cout << "extract_from_tar " << extract_from_tar(pTar, fileList, fileInPos, rand()%fileList.size()) << endl;

    tar_close(pTar);
}
东门翰
2023-03-14

我就是这样做的。很好,但对我来说不太明显

TAR *pTar;  
int i=0;
tar_open(&pTar, xva_filename, 0, O_RDONLY, 0, 0);
while ((i = th_read(pTar)) == 0)
{
    //th_print_long_ls(pTar);
    //th_print(pTar);
    if(strcmp(pTar->th_buf.name,"ova.xml")==0)
    {
        puts(pTar->th_buf.name);
        tar_extract_regfile(pTar,pTar->th_buf.name);
    }


    if (TH_ISREG(pTar) && tar_skip_regfile(pTar) != 0)
    {
        fprintf(stderr, "tar_skip_regfile(): %s\n",
            strerror(errno));
        return;
    }
}
 类似资料:
  • npm install extract-text-webpack-plugin --save-dev 简单的方法 requires vue-loader@^12.0.0 and webpack@^2.0.0 // webpack.config.js var ExtractTextPlugin = require("extract-text-webpack-plugin") module.exp

  • 将所有Vue组件中的所有已处理的CSS解压缩到单个CSS文件中示例配置: Webpack 2.x npm install extract-text-webpack-plugin@2.x --save-dev // webpack.config.js var ExtractTextPlugin = require("extract-text-webpack-plugin") module.exp

  • 本文向大家介绍SQL Server 提取数字、提取英文、提取中文的sql语句,包括了SQL Server 提取数字、提取英文、提取中文的sql语句的使用技巧和注意事项,需要的朋友参考一下

  • 我需要从如下节点中提取文本: 我需要建立: 仅返回div的所有内容。-不在子元素内的所有内容。两者都错了。迭代子节点会忽略文本节点。 文本节点-某些文本

  • 我需要从大文件中提取文本(最大限制50MB)文件可能是doc、ppt、xls、txt或pdf格式。到目前为止,我使用了ApachePOI'http://poi.apache.org/' 用于Microsoft Office文档和PDFBox从PDF中提取文本。然而,随着文件变大,提取过程变得缓慢,特别是以下文件。到目前为止我取得的成果: 1. PPTX-45MB-3分钟apx 2.PDF-62MB

  • 问题内容: 之前,我问了一个有关用Java提取RAR归档文件的问题,有人指出我指向JUnrar。官方网站已关闭,但由于我在网上发现了很多有关它的讨论,因此它似乎已被广泛使用。 有人可以告诉我如何使用JUnrar提取存档中的所有文件吗?我在网上找到了一个小片段,但似乎不起作用。它显示存档中的每个项目都是一个目录,即使它是一个文件。 谢谢。 问题答案: 可能您还应该检查此代码段代码。可以在下面找到其副