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

时间:2013-07-29 09:13:44

标签: 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);

我是否正确?如果我的逻辑有任何问题,请纠正我吗?

2 个答案:

答案 0 :(得分:1)

除了错误外,看起来并不太糟糕: - )

  1. 您设置了skip = ...而不是skip += ..,因此您在buffer中的排名仅适用于第二个文件
  2. 您没有检查第一个文件(因为它是do { ... } while(),而且当您第一次拨打strstr()时,contents已经在buffer处填充了skip 1}}> 0)。
  3. 当您找到“文件名”""时,您还应添加“中断”条件以停止循环。
  4. 修改 我们当然也应该检查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
    }
    

答案 1 :(得分:0)

最后,我已经为这个问题提出了解决方案,代码必须如下 -

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);

我想它的自我解释。如果不 ??不要犹豫,问我。