0

tar ファイル内にあるファイルの 1 つである html ファイルを取得しようとしていますが、正しいかどうかわからない何かを考えています?? 私が間違っている場合は指摘してください。私の考えは-

tarファイルからストリームを作成し、そのストリームをバッファに保存してコンテンツを取得し、strstrコマンドを使用してtarファイル内のhtmlファイルを検索します(私のtarファイルでは、htmlコンテンツが「<!doctypeから始まることがわかっているため) html" と </"/html>"で終わるので、実際には html ファイルであるそれらの間のコンテンツをロードします。私のアプローチは正しいですか??

問題は、バッファーに非常に大きなサイズを指定すると (ただし、html + 他の多くのファイルを含む tar ファイルのサイズよりも小さい)、デバッグ時にスタック オーバー フローが発生することです。しかし、小さなインデックスを指定すると、メモ帳でtarファイルを開くと、開始時にある他のファイルの内容が表示されます(メモ帳でtarファイルを開いて確認しましたが、これらの内容はtarファイルに実際に存在しますが、開始時にファイルの途中にあるhtmlファイルにアクセスするためにバッファのインデックスを増やしたとき(実際には非常に大きなインデックスが必要です)、デバッグ時にスタックオーバーフローが発生します)。私のコードは-

     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'\0';
                    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 ファイルの途中にあるバッファの内容にアクセスするためにバッファに大きなインデックスを指定すると、スタック オーバーフローが発生するのはなぜですか。

4

1 に答える 1

0

スタックのサイズには制限があるため、任意に大量に割り当てるだけでは機能しません。使用可能なスタック内に収まるように制限を設定してから、読み取りのためにループする必要があります (「針の文字列」(探しているもの) は 2 つのブロック間の「ギャップ」にまたがっていますが、克服することは可能です (以下を参照)。または、単にスタックを使用せずに、newファイル全体を保持するのに十分なメモリを割り当てるために使用します。もちろん、ファイルが非常に大きく、それは機能しません - ファイルはコンピュータの総メモリよりも大きくなる可能性があり、それからあなたはいっぱいになり、「一度に少しずつ読む」に戻らなければなりません。ファイル全体をメモリに読み込むためのリソースのほとんどを破棄するだけです。

1 つのバッファーを使用する 1 つの解決策は、"針" の長さをバッファーのサイズに追加することです。2回目の読み込みでは、バッファの後ろからneedleバイトの長さを先頭にコピーし、「needle」バイトでバッファに読み込み、バッファの先頭から検索します。バッファが「針」に比べてかなり大きい限り、バッファの同じ部分を 2 回検索するオーバーヘッドは問題になりません。

于 2013-07-24T09:23:17.363 に答える