试图获取位于tar文件中的html文件的内容

trying to get content of html file which is located inside the tar file

本文关键字:文件 html tar 获取      更新时间:2023-10-16

我正在尝试获取一个html文件,该文件是位于tar文件中的一个文件,但我有一些想法,我不知道它是否正确??如果我错了,请指点我。我的想法是-

我从tar文件中创建了一个流,并将该流存储在缓冲区中以获取其内容,然后使用strstr命令搜索tar文件中的html文件(正如我所知,在我的tar文件中,html内容从"<!doctype html"开始,以<"/html/>"结束,所以我将在它们之间加载内容,实际上就是html文件)。我的方法正确吗??

问题是,当我给缓冲区很大的大小(但小于包含html+许多其他文件的tar文件的大小)时,它会在调试时产生堆栈溢出。但是,当我给出小索引时,如果我在notepad中打开tar文件,它会显示位于启动中的其他文件的内容(我已经通过在notepad中打开tar来检查,这些内容确实存在于tar文件中,但在tar文件的启动时,所以当我增加缓冲区的索引以访问位于文件中间的html文件时(实际上需要非常大的索引)它在调试方面给了stackoverflow)。我的代码是-

     HRESULT AMEPreviewHandler:: CreateHtmlPreview(IStream *m_pStream) //this function is called from
        // somewhere
             ULONG  CbRead;
                    const int Size= 115000 ; 
                    char Buffer[Size+1];
                    (m_pStream)->Read(Buffer, Size, &CbRead );
                    Buffer[CbRead ] = L'';
                    char *compare= "<!doctype html"; //this we have to search in tar file
    // content because the html file contents starts from here
                    char * StartPosition;
                    StartPosition = strstr (Buffer,compare); //StartPosition  gives Bad
// pointer when Size is small on debugging at this small size i can see some contents in buffer which i 
//can find in tar file at starting 
                    __int64 count=0; 
                    while (StartPosition!=NULL)
                    {
    MessageBox(m_hwndPreview,L"hurr inside the while loop",L"BTN WND",MB_ICONINFORMATION);
                        count=StartPosition-Buffer+1; //to get the location of 
    //"<!doctype html";
                                                        }

                    MessageBox(m_hwndPreview,L"wafter the while loop in CreateHtmlPreview  ",L"BTN WND",MB_ICONINFORMATION); 
                    return true;
                }

请告诉我在tar文件中获取html文件内容的方法是正确的吗??当我给缓冲区很大的索引以访问位于tar文件中间的缓冲区内容时,为什么会出现堆栈溢出?如果我手动查看,即使我声明的大小也小于tar文件的大小?

堆栈的大小有限,因此仅分配任意大的数量是不可行的-您要么需要对其设置一个适合可用堆栈的限制,然后循环读取(如果您的"针串"(您正在寻找的)跨越两个块之间的"间隙",这会很有趣,但可以克服(见下文)。或者干脆不使用堆栈,而是使用new来分配足够的内存来容纳整个文件。当然,如果文件很大,那就不起作用了——文件可能比你电脑的总内存还大,然后你就被塞满了,不得不回去"一次读一点"。将整个文件读取到内存中,结果却将大部分文件丢弃,这在资源方面也是浪费。

使用一个缓冲区的一种解决方案是将"针"的长度添加到缓冲区的大小中。当您第二次读取时,将针字节的长度从缓冲区的后面复制到开头,然后在"针"字节中读取缓冲区,然后从缓冲区开始搜索。只要缓冲区与"针"相比相当大,在缓冲区的同一部分搜索两次的开销就无关紧要了。