2013-02-03 220 views
0

作爲正在處理的應用程序的一部分,我需要統計目錄中的所有文件及其子目錄。我已經寫了一個遞歸函數,但奇怪的是,它不計算大目錄中的所有文件 - 但它對較小的文件很好。統計目錄及其子目錄中的所有文件

在一個包含16個文件(其中8個在子目錄中)的目錄中工作正常,但是當在大約500個文件夾中的8000個文件上測試它時,它停止了760個文件的計數。

的代碼是:

void RecursiveSearch(wchar_t* param, int* pFiles) 
{ 
HANDLE hFind; 
WIN32_FIND_DATA wfd; 

wchar_t* junk = new wchar_t [2]; 
StringCchPrintf(junk,2,L"."); 
wchar_t* path = new wchar_t [MAX_PATH]; 
StringCchPrintf(path,MAX_PATH,L"%s\\*",param); 

hFind = FindFirstFile(path,&wfd); 

    do { 
     if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) { 
      wchar_t* tpath = new wchar_t [MAX_PATH]; 
      StringCchPrintf(tpath,MAX_PATH,L"%s%s\\*",param,wfd.cFileName); 
      if (wfd.cFileName[0] == junk[0]) { 
       delete [] tpath; //filter for '.' directories 
      } else { 
       RecursiveSearch(tpath,pFiles); 
       delete [] tpath; 
      } 
     } else { 
      ++*pFiles; 
     } 
    } while (FindNextFile(hFind,&wfd) == TRUE); 

delete [] junk, param, path; 
return; 
} 

'PARAM' 的指針傳遞的文件路徑(沒有\)和 'PFILES' 是到包含該文件數的int。

誰能告訴我我做錯了什麼?我在這裏看過幾個類似的帖子,但沒有一個似乎處理這個問題。

+2

你試過調試呢?它是否停留在特定的嵌套級別? –

+1

MAX_PATH足夠大嗎?也許還要檢查StringCchPrintf()的返回碼。 –

+0

這段代碼看起來與那些新的和刪除[]混亂。如果不排除boost(實際上應該沒有理由),請查看http://www.boost.org/doc/libs/1_52_0/libs/filesystem/doc/tutorial.html –

回答

0

我剛剛發現問題,它看起來像添加一個新的目錄名稱時未被刪除,導致不正確的路徑。下面是改進的代碼。

void RecursiveSearch(wchar_t* param, int* pFiles) 
{ 
HANDLE hFind; 
WIN32_FIND_DATA wfd; 

wchar_t* junk= new wchar_t [2]; 
StringCchPrintf(junk,2,L"."); 
wchar_t* path = new wchar_t [MAX_PATH]; 
StringCchPrintf(path,MAX_PATH,L"%s*",param); 

hFind = FindFirstFile(path,&wfd); 

    do { 
     if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) { 
      wchar_t* tPath = new wchar_t [MAX_PATH]; 

      //Remove misplaced stars 
      wchar_t* locator = new wchar_t [2]; 
      StringCchPrintf(locator,2,L"\\"); 
      wchar_t* cleanParam = new wchar_t [MAX_PATH]; 
      for (int i = 0; i < MAX_PATH; i++) { 
       if (param[MAX_PATH-i] == locator[0]) { 
        StringCchPrintf(cleanParam,(MAX_PATH-i)+2,L"%s",param); 
        break; 
       } 
      } 

      StringCchPrintf(tPath,MAX_PATH,L"%s%s\\*",cleanParam,wfd.cFileName); 
      if (wfd.cFileName[0] == junk[0]) { 
       delete [] tPath; 
      } else { 
       RecursiveSearch(ebx,pFiles); 
       delete [] tPath; 
      } 
     } 
     else{ 
      ++*pFiles; 
     } 
    } while (FindNextFile(hFind,&wfd) == TRUE); 

delete [] junk, param, path; 
return; 
} 

感謝您的評論安迪警車 - 你讓我找對了地方:)

相關問題