c++ - 如何跳过 tar 文件中的文件以获取特定文件

标签 c++ html-parsing tar

我正在尝试获取 tar 文件中存在的 html 文件的内容(我正在使用 Visual C++ 来完成我的任务)。我的方法是使用流将 tar 存储在缓冲区中,然后将 html 的内容存储在另一个缓冲区中。然后使用缓冲区转到位于缓冲区 [0-100] 位置的 tar 文件中存在的每个文件的文件名(在此位置我们有文件名)并将文件名存储在“内容”中(在我的例子中)并搜索它是否有 extension.html 文件??

如果文件名中有 .html,则将其内容从位置缓冲区存储 [PreviousFileSizes +512](PreviousFileSizes 我的意思是在这个 html 文件之前有一些文件,所以我们必须将它们的大小添加到缓冲区中索引转到正确的位置 - 我的意思是我不假设 tar 文件中的第一个文件是 html 文件 - 在我的代码中我用“跳过”表示这个 PreviousFileSizes - 这意味着要跳过这么多大小以转到我们的 html 文件).

我实现它的代码是-

int skip=0;
            char contents [100];
            //char test[1000];
            do
            {

                    int SizeOfFile = CreateOctalToInteger(&buffer[skip+124],11);
                    size_t distance= ((SizeOfFile%512) ? SizeOfFile + 512 - (SizeOfFile%512) : SizeOfFile );
                    size_t skip= distance +512;
                    memcpy(contents,&buffer[skip],100);




            }
            while(strstr(contents,".html") != NULL);

我走对了吗??如果我的逻辑有什么不对请指正我??

最佳答案

除了错误之外看起来还不错 :-)

  1. 你设置了 skip = ... 而不是 skip += ..,所以你在 buffer 中的位置只有第二个是正确的文件
  2. 您不检查第一个文件(因为它是 do { ... } while() 并且您第一次调用 strstr() 时, contents 已经在某个位置被 buffer 填充 skip > 0)。
  3. 您还应该添加一个“中断”条件以在找到“文件名”"" 时停止循环。

编辑 我们当然也应该检查 tar 文件的大小。

我会这样尝试:

// I assume size_t bufsize to be the tar file size

size_t skip = 0;
while( bufsize > skip && strcmp( buffer+skip, "" ) != 0 && strstr( buffer+skip, ".html" ) != 0 ) {
     int SizeOfFile = CreateOctalToInteger(&buffer[skip+124],11);
     size_t distance= ((SizeOfFile%512) ? SizeOfFile + 512 - (SizeOfFile%512) : SizeOfFile );
     skip += distance +512;  
}

if( bufsize > skip && strstr( buffer+skip, ".html" ) == 0 ) {
    // hooray
    int SizeOfHTML = CreateOctalToInteger(&buffer[skip+124],11);
    char *htmlData = buffer+skip+512;

    // do stuff with htmlData
}

关于c++ - 如何跳过 tar 文件中的文件以获取特定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17920081/

相关文章:

c++ - 如何使用live555串流视频?

PHP DOM loadHtmlFile I/O 异常

c# - C# 中的 JQuery 样式 dom 操作

linux - Bash - 如何归档和压缩子目录中的文件,但只能使用特定的文件名

c++ - 映射/设置删除迭代器超出范围

c++ - 成员抵消宏 - 需要详细信息

c++\"转义序列用于在 system() 函数中包含引号

python - 如何提取特定标题后的 HTML 表格?

bash - 如何将进度条添加到 somearchive.tar.xz 提取

linux - 将文件解压到新文件夹中