2013-07-29 88 views
0

我打算獲取tar文件中存在的html文件的內容(我正在使用visual C++來完成我的任務)。我的方法是使用流將tar存儲在緩衝區中,然後將html的內容存儲在另一個緩衝區中。然後使用緩衝區轉到位置緩衝區[0-100]處的tar文件中存在的每個文件的文件名(此處位置我們有文件名),並將文件名存儲在「內容」(在我的情況),並搜索是否有extension.html文件?如何跳過tar文件中的文件來獲取特定文件

如果它在文件名中有.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); 

我要去吧??請糾正我,如果有什麼錯在我的邏輯?

+0

您是否嘗試過使用'tar xf mytarfile myfile.html'?這不是很容易嗎? –

+0

是否有任何命令你正在討論...如果是,我不必處理命令提示符。只需獲取HTML文件的內容在tar文件中存在的C++代碼..如果它的任何新的和容易的事情請解釋我正確的是什麼,「tar xf mytarfile myfile.html」?? – Sss

+0

我的意思是命令提示工具 - 如果你採取了這個選項,你上週就已經完成了。只是因爲它是一個命令提示工具。或者找一個運行在GUI中的'tar'的工具,我相信有這樣的東西。 –

回答

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

我猜自身explantory。如果不 ??不要猶豫,問我。

1

不看除了錯誤太糟糕:-)

  1. 設置skip = ...代替skip += ..,讓您在buffer位置僅是對第二個文件正確
  2. 你不檢查第一個文件(因爲它是do { ... } while(),並且第一次您撥打strstr(),contents已在某些位置> 0處填充了buffer)。
  3. 當您找到'文件名'""時,您還應該添加'break'條件以停止循環。

編輯 ,我們當然應該也檢查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 
} 
+0

有一些疑慮。爲什麼你已經使用了這個條件(1.)strcmp(buffer + skip,「你爲什麼有空白」)!= 0(2.)通過這個buffer + skip。你說什麼意思? (3.)你在哪裏要求我打破條件。我是否需要在你寫的代碼中放置條件? – Sss

+0

比較文件名到'「」'是因爲我的答案的第3點。這只是*額外的休息條件。 'buffer + skip'等價於'&buffer [skip]'。這取決於你喜歡什麼,猜猜我喜歡什麼:-)。無論如何,這僅僅和你在原始代碼中做的一樣 - 將文件名作爲位置「skip」進行比較 - 只是沒有將一部分複製到「contents」中什麼是簡單的不必要的 –

+0

但是在程序中,我不知道fileName。因爲我的程序是針對每個包含其中的.html文件的tar文件的。實際上我需要存儲.html內容並需要使用緩衝區顯示它。所以我不知道什麼是tar文件裏面的文件的文件名。在這種情況下,我可以手動查看文件名,但不可能看到包含html文件的每個tar文件。我的程序應該適用於tar文件中存在的每個html文件。你明白我的意思嗎? – Sss

相關問題