整了份递归代码,测试发现有如下问题
1.目录文件多了,查找出来的文件不全
2.文件名字有时也不完整
3.不用线程,能否在中途停止查找,或是判断查找结束
代码如下:int CFileManager::Find(char *filename, char *dirname, unsigned int numfound)
{ char sendbuf[100], tmpPath[256], newPath[256],PathName[256];
   
WIN32_FIND_DATA fd;
HANDLE fh;
   
LPBYTE lpList = NULL;
int nLen =0 ;
DWORD dwOffset = 0; // 位移指针
LPBYTE lpBuffer = NULL;
DWORD nBufferSize =  1024 * 10; // 先分配10K的缓冲区
    DWORD dwLength = 0;
    lpList = (BYTE *)LocalAlloc(LPTR, nBufferSize);   *lpList = TOKEN_FILE_FIND_LIST;
    
     dwOffset = 1; _snprintf(tmpPath, sizeof(tmpPath), "%s\\*", dirname);
if ((fh = FindFirstFile(tmpPath, &fd)) != INVALID_HANDLE_VALUE)
do {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (fd.cFileName[0] != '.' || (fd.cFileName[1] && fd.cFileName[1] != '.')) 
{
_snprintf(newPath,sizeof(newPath),"%s\\%s", dirname,fd.cFileName); numfound = Find(filename, newPath, numfound);
}
}
} while (FindNextFile(fh, &fd));
FindClose(fh);
_snprintf(tmpPath, sizeof(tmpPath), "%s\\%s", dirname, filename); if ((fh = FindFirstFile(tmpPath, &fd)) != INVALID_HANDLE_VALUE)
do {
numfound ++; _snprintf(PathName,sizeof(PathName),"%s\\%s",dirname,fd.cFileName);

nLen = lstrlen(PathName)+1;
     memcpy(lpList+ dwOffset, PathName, nLen);
                MessageBox(NULL, (char *)(lpList), PathName, NULL); } while (FindNextFile(fh, &fd));
 FindClose(fh); // 关闭查找句柄return (numfound);
}

解决方案 »

  1.   

    void FindFile(CString strPath)
    {
      CFileFind fileFind;
      BOOL bWorking = fileFind.FindFile(strPath+L"\\*.*");
      while(bWorking)
      {  
         CString filename=fileFind.GetFileName();//取得文件名
         bWorking = fileFind.FindNextFile();
         if(fileFind.IsDots())continue;//如果有.或..,则continue
         if(fileFind.IsDirectory())//如果找到文件夹
         {
            CString strDir = fileFind.GetFileName();//取得文件夹名
            CString strPath1 = strPath+L"\\"+strDir;//文件夹路径
            FindFile(strPath1);//循环查找
         }
      }
      fileFind.Close();
    }
      

  2.   

    用FindFirstFile和FindNextFile,程序不是MFC
      

  3.   

    MSDN上不是有例子代码吗?拿来修改一下即可
    CFileFind::FindFile/FileNextFile()
      

  4.   

    LZ很喜欢自己管理字符串内存么,本来简单的代码看起来臃肿。bool go_through_directory_impl(LPCTSTR path,bool inc_sub)
    {
    wstring root(path);
    if(root[root.length() - 1] != _T('\\'))
    root.push_back(_T('\\'));
    wstring find_pattern = root + _T("*.*");
    wstring sub_item; bool cancel = false;//cancel可以改成指向外部指针.
    WIN32_FIND_DATA wfd = { 0 };
    HANDLE hFile = FindFirstFile(find_pattern.c_str(),&wfd);
    if(hFile == INVALID_HANDLE_VALUE)
    return false;
    do 
    {
    if(!_tcsicmp(wfd.cFileName, _T(".")) || !_tcsicmp(wfd.cFileName, _T("..")))
    continue;
    sub_item = root + wfd.cFileName; if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && inc_sub) 
    {
    sub_item.push_back(_T('\\'));
    if(!cancel)
    cancel = go_through_directory_impl(sub_item.c_str(),inc_sub);
    } wprintf(L"Item(%s),path(%d)\n",sub_item.c_str(),(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)); } while (FindNextFile(hFile,&wfd) && !cancel);
    FindClose(hFile);
    return cancel;
    }
      

  5.   

    int CFileManager::Find(char *filename, char *dirname, unsigned int numfound)if (fd.cFileName[0] != '.' || (fd.cFileName[1] && fd.cFileName[1] != '.')) 
    递归的时候你跟踪一下,因为你的参数是用指针,当递归内层的函数结束时,外层的参数指针还是带有内层目录指针的。char sendbuf[100], tmpPath[256], newPath[256],PathName[256];
    递归最好少用栈保存路径,层次多后栈就溢出了。。
      

  6.   

    自己最后解决了,最开始用的Cedit来返回搜索的信息,后来用Clistctrl来返回,就完整了,原来是控件的问题