如何跳过tar文件中的文件以获取特定文件 我想获取一个HTML文件的内容,它存在于TAR文件中(我使用VisualC++完成我的任务)。我的方法是使用一个流将tar存储在一个缓冲区中,然后将html的内容存储在另一个缓冲区中。然后使用缓冲区将tar文件中存在的每个文件的文件名定位到buffer[0-100](在这个位置我们有文件名)并将文件名存储在“contents”(在我的例子中)中并搜索它是否有扩展名.html文件

如何跳过tar文件中的文件以获取特定文件 我想获取一个HTML文件的内容,它存在于TAR文件中(我使用VisualC++完成我的任务)。我的方法是使用一个流将tar存储在一个缓冲区中,然后将html的内容存储在另一个缓冲区中。然后使用缓冲区将tar文件中存在的每个文件的文件名定位到buffer[0-100](在这个位置我们有文件名)并将文件名存储在“contents”(在我的例子中)中并搜索它是否有扩展名.html文件,c++,html-parsing,tar,C++,Html Parsing,Tar,如果文件名中有.html,则从位置缓冲区[PreviousFileSizes+512]存储其内容(我所说的PreviousFileSizes是指在这个html文件之前有一些文件,所以我们必须在缓冲区索引中添加它们的大小以转到正确的位置-我的意思是,我没有假设tar文件中的第一个文件是html文件。在我的代码中,我用“跳过”来表示这个PreviousFileSizes-这意味着要跳过这么大的大小才能转到我们的html文件) 我实现它的代码是- int skip=0; cha

如果文件名中有.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+=…
    ,因此您在
    缓冲区中的位置仅对第二个文件正确
  • 您不检查第一个文件(因为它是
    do{…}while()
    ,并且您第一次调用
    strstr()
    内容
    已经在某个位置填充了
    缓冲区
  • 还应添加“中断”条件,以在找到“文件名”时停止循环 编辑 当然,我们还应该检查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);
    

    我猜这是自我解释。如果没有呢??请尽管问我。

    您是否尝试过使用
    tar xf mytarfile myfile.html
    ?这不是很容易吗?是你正在谈论的任何命令吗?如果是,我不必处理命令提示符。只是C++代码,用于获取在TAR文件中存在的HTML文件的内容。如果有什么新的简单的东西,请适当地解释一下“tar xf mytarfile myfile.html”是什么?我指的是命令提示符工具-如果你选择了这个选项,你上周就已经完成了。只要接受它是一个命令提示工具这一事实就行了。或者找一个能在GUI中运行的
    tar
    工具,我肯定会有这样的东西。对不起,Mats..我不知道如何做ar所说的。请给我一些链接到undersatnd well。但是在前面的代码中,我得到了下一个文件的大小(我的意思是我只能滑动第一个文件,而不是第二个文件。我认为在do while循环µ中存在一些问题。你能预测出这个问题是什么吗?(我的意思是,在我找不到.html文件之前,这个跳过不会重复循环。它只执行一次,调试时我可以看到tar文件中第二个文件的文件内容,但之后会出现)不,我不知道任何链接-我肯定它们存在,但我相信你可以像我一样使用谷歌。有一些疑问。你为什么使用这个条件(1)strcmp(buffer+skip,“why you have keep BLANK”)!=0(2。)通过这个buffer+skip。你的意思是什么您要求我中断条件的位置。我是否需要在您编写的代码中设置中断条件??将文件名与
    进行比较是因为我的回答中的第3点。这只是额外的中断条件。
    buffer+skip
    相当于
    &buffer[skip]
    。你更喜欢什么取决于你,猜猜我更喜欢什么:-)。无论如何,这与您在原始代码中所做的操作相同—将文件名与position
    skip
    进行比较—只是没有将一部分复制到
    contents
    中,这是不必要的,但在程序中我不知道文件名。因为我的程序适用于每个包含.html文件的tar文件。实际上,我需要撕开.html内容并需要使用缓冲区显示。因此,我不知道tar文件中的文件名是什么。在这种情况下,我可以手动查看文件名,但无法查看包含html文件的每个tar文件。我的程序应该适用于tar文件中存在的每个html文件。你明白我所说的吗要说什么?我的代码中使用了什么文件名,除了最后一个文件后面的文件名之外?
    请看。请尝试一下