0

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

如果文件名中有.html,则从位置缓冲区存储其内容[PreviousFileSizes +512](通过 PreviousFileSizes 我的意思是在此 html 文件之前有一些文件,因此我们必须将它们的大小添加到缓冲区索引中到正确的位置——我的意思是我不假设 tar 文件中的第一个文件是 html 文件——在我的代码中,我用“skip”表示这个 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);

我走对了吗??如果我的逻辑有问题,请纠正我?

4

2 回答 2

1

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

  1. 您设置skip = ...而不是skip += ..,因此您的位置buffer仅适用于第二个文件
  2. 您不检查第一个文件(因为它是do { ... } while()并且您第一次调用strstr(),已经在某个位置> 0处contents填充)。bufferskip
  3. 您还应该添加一个 'break' 条件以在找到 'file name' 时停止循环""

编辑 ,我们当然也应该检查 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
}
于 2013-07-29T12:50:13.060 回答
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);

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

于 2013-07-29T16:01:34.850 回答