2013-02-03 57 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; 
} 

感谢您的评论安迪警车 - 你让我找对了地方:)

相关问题