vc中如何遍历指定的目录以及目录中的子目录  
并且获得子目录中的每个文件的完整路径  
以便在程序中对这些文件进行解析

解决方案 »

  1.   

    照搬的例子
    void Recurse(LPCTSTR pstr)
    {
       CFileFind finder;   // build a string with wildcards
       CString strWildcard(pstr);
       strWildcard += _T("\\*.*");   // start working for files
       BOOL bWorking = finder.FindFile(strWildcard);   while (bWorking)
       {
          bWorking = finder.FindNextFile();      // skip . and .. files; otherwise, we'd
          // recur infinitely!      if (finder.IsDots())
             continue;      // if it's a directory, recursively search it      if (finder.IsDirectory())
          {
             CString str = finder.GetFilePath();
             TRACE(_T("%s\n"), (LPCTSTR)str);
             Recurse(str);
          }
       }   finder.Close();
    }void PrintDirs()
    {
       Recurse(_T("C:"));
    }
      

  2.   

    find(char * lpPath)
    {
      char szFind[MAX_PATH];
      WIN32_FIND_DATA FindFileData;
      strcpy(szFind,lpPath);
      strcat(szFind,"*.*");
      HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
      if(INVALID_HANDLE_VALUE == hFind)  return;
      while(TRUE)
      {
        if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
          if(FindFileData.cFileName[0]!='.')
          {
            strcpy(szFile,lpPath);
            strcat(szFile,"");
            strcat(szFile,FindFileData.cFileName);
            find(szFile);
          }
        }
        else
        {
          cout << FindFileData.cFileName;
        }
        if(!FindNextFile(hFind,&FindFileData))  break;
      }
      FindClose(hFind);
    }
      

  3.   

    #include <windows.h>
    #include <iostream>
    #include <string>
    using namespace std;bool IsRoot(string Path)
    {
    string Root;
    Root=Path.at(0)+":\\";
    if(Root==Path)
    return true;
    else
    return false;
    }void FindInAll(string Path)
    {
    string szFind;
    szFind=Path;
    if(!IsRoot(szFind))
    szFind+="\\";
    szFind+="*.*";
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind=FindFirstFile(szFind.c_str(),& FindFileData);
    if(hFind==INVALID_HANDLE_VALUE)
    return ;
    do
    {
    if(FindFileData.cFileName[0]=='.') //过滤本级目录和父目录
    continue;
    if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //如果找到的是目录,则进入此目录进行递归
    {
    string szFile;
    if(IsRoot(Path))
    szFile=Path+FindFileData.cFileName;
    else
    szFile=Path+"\\"+FindFileData.cFileName;
    FindInAll(szFile);
    }
    else //找到的是文件
    {
    string szFile;
    if(IsRoot(Path))
    szFile=Path+FindFileData.cFileName;
    else
    szFile=Path+"\\"+FindFileData.cFileName;
    cout<<szFile<<endl;
    cout<<FindFileData.cFileName<<endl;
    }
    }
    while(FindNextFile(hFind,& FindFileData));
    FindClose(hFind);

    int main()
    {
    FindInAll("C:\\Documents and Settings\\user\\桌面\\ses");
    return 0;
    }