如何跳过tar文件中的一个文件以获得特定的文件

how to skip a file inside the tar file to get a particular file

本文关键字:文件 一个 tar 何跳过      更新时间:2023-10-16

我正在字符串中获取tar文件中的html文件的内容(我正在使用visual c++来完成我的任务)。我的方法是使用流将tar存储在缓冲区中,然后将html的内容存储在另一个缓冲区中。然后使用buffer到位置buffer[0-100]的tar文件中每个文件的文件名(在这个位置我们有文件名),并将文件名存储在"contents"中(在我的情况下),然后搜索它是否具有扩展名.html文件??

如果它的文件名中有.html,那么将其内容存储在位置缓冲区[PreviousFileSizes+512]中(PreviousFileSizes我的意思是在这个html文件之前有一些文件,所以我们必须在缓冲区索引中添加它们的大小才能到达正确的位置-我的意思不是假设tar文件中的第一个文件是html文件。在我的代码中,我用"skip"表示这个PreviousFileSize-这意味着要跳过这么大的大小才能转到我们的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已经在某个位置skip>0填充了buffer
  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
}

最后,我为这个问题找到了解决方案,代码必须如下所示-

char* StartPosition;
size_t skip= 0;
    char HtmlFileContents [200000];
    char contents [8000];
    do
    { 
            int SizeOfFile = CreateOctalToInteger(&buffer[skip+124],11);
            size_t distance= ((SizeOfFile%512) ? SizeOfFile + 512 - (SizeOfFile%512) : SizeOfFile );
            skip += distance + 512;
            memcpy(contents,&buffer[skip],100);
            if (StartPosition=strstr(contents,".html"))
            {
                MessageBox(m_hwndPreview,L"finally string is copied",L"BTN WND6",MB_ICONINFORMATION);
                int SizeOfFile = CreateOctalToInteger(&buffer[skip+124],11);
                memcpy(HtmlFileContents,&buffer[skip+512],SizeOfFile);
                break;
            }

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

我想这是自我解释。如果没有??请毫不犹豫地问我。