【问题标题】:how to skip a file inside the tar file to get a particular file如何跳过 tar 文件中的文件以获取特定文件
【发布时间】:2013-07-29 09:13:44
【问题描述】:

我正在尝试获取 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);

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

【问题讨论】:

  • 您是否尝试过使用tar xf mytarfile myfile.html?这不会容易很多吗?
  • 这是你在谈论的任何命令吗?如果是,我不必处理命令提示符。只需 c++ 代码即可获取 tar 文件中存在的 html 文件的内容。如果它任何新的和简单的事情请正确解释我“tar xf mytarfile myfile.html”是什么??
  • 我的意思是命令提示符工具——如果你选择了这个选项,你上周就已经完成了。只是忍受它是一个命令提示符工具的事实。或者找一个tar能在GUI中运行的工具,肯定有这样的东西。
  • 对不起垫子..我不知道如何做你所说的。请给我一些链接到undersatnd well。但是在前面的代码中,我得到了下一个文件的大小(我的意思是我只是能够滑动第一个文件而不是第二个文件。我认为 do while loopµ 中存在一些问题。你能预测一下是什么问题吗? (我的意思是这个跳过不会重复循环,直到我找不到 .html 文件。它只执行一次,就这样在调试时我可以在 tar 文件中看到第二个文件的文件内容,但之后会出现)跨度>
  • 不,我不知道任何链接 - 我确定它们存在,但我确信您可以像我一样使用 google。

标签: c++ html-parsing tar


【解决方案1】:

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

  1. 您设置了skip = ... 而不是skip += ..,因此您在buffer 中的位置仅适用于第二个文件
  2. 你不检查第一个文件(因为它是do { ... } while(),而你第一次调用strstr()contents 已经在某个位置填充了buffer skip > 0)。
  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
}

【讨论】:

  • 有些疑问。为什么你使用了这个条件 (1.) strcmp(buffer+skip, "WHY YOU HAVE IT KEPT IT BLANK" ) != 0 (2.) 通过这个 buffer+skip。你是什​​么意思? (3.) 你要我打破条件的地方。我需要在你写的代码中加入中断条件吗??
  • 将文件名与"" 进行比较是因为我回答的第 3 点。这只是 额外的中断条件。 buffer+skip 等价于 &buffer[skip]。这取决于你更喜欢什么,猜猜我更喜欢什么:-)。无论如何,这与您在原始代码中所做的相同——将文件名与位置skip 进行比较——只是没有将一部分复制到contents 这根本是不必要的
  • 但在程序中我不知道文件名。因为我的程序适用于其中包含 .html 文件的每个 tar 文件。实际上我需要存储 .html 内容并需要使用缓冲区显示它。所以我不知道 tar 文件中文件的文件名是什么。在这种情况下,我可以手动查看文件名,但无法查看包含 html 文件的每个 tar 文件。我的程序应该适用于 tar 文件中存在的每个 html 文件。你明白我的意思了吗?
  • 除了"" 之外,我的代码中使用了什么文件名在最后一个文件的后面?看here again。请尝试一下
【解决方案2】:

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

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

我猜它不言自明。如果不 ??不要犹豫,问我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-02
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多