我正在尝试获取 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);
我走对了吗??如果我的逻辑有什么不对请指正我??
最佳答案
除了错误之外看起来还不错 :-)
- 你设置了
skip = ...
而不是skip += ..
,所以你在buffer
中的位置只有第二个是正确的文件 - 您不检查第一个文件(因为它是
do { ... } while()
并且您第一次调用strstr()
时,contents
已经在某个位置被buffer
填充skip
> 0)。 - 您还应该添加一个“中断”条件以在找到“文件名”
""
时停止循环。
编辑 我们当然也应该检查 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/