请教:
如何用C++语言实现遍历指定目录下所有路径,
越详细越好,谢谢大家

解决方案 »

  1.   

    FindFirstFile/FindNextFile()
    或者使用MFC的CFileFind类
      

  2.   

    新建一个find.bat
    @echo off
    dir /S /b dir_name >filepath.txt
    exit
    =========
    c++中:
    system("find.bat");
      

  3.   


    void TraverseDir(CString& strDir, std::vector<CString>& vecDir)
    {   
    WIN32_FIND_DATA FindFileData;
    CString strDirTmp;
    strDirTmp = strDir;
    strDirTmp += "\\*.*";
    HANDLE hFind=::FindFirstFile(strDirTmp,&FindFileData);
    if(INVALID_HANDLE_VALUE == hFind)
    {
    return;
    }
    while(TRUE)
    {
    if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
    if(FindFileData.cFileName[0]!= _T('.'))
    {
    strDirTmp = strDir;
    strDirTmp += "\\";
    strDirTmp += FindFileData.cFileName;
    vecDir.push_back(strDirTmp);
    //TraverseDir(strDirTmp,vecFile) ;
    }
    }
    else//是文件
    {
    /*strDirTmp = strDir;
    strDirTmp += "\\";
    strDirTmp += FindFileData.cFileName;
    vecFile.push_back(strDirTmp);*/
    }
    if(!FindNextFile(hFind,&FindFileData))    
    break;
    }
    FindClose(hFind);

    从我的程序中扣出来的,可以用的,修改修改就好了
      

  4.   

    使用递归的方式遍历指定路劲中的文件和文件夹:#define _WIN32_WINNT 0x0500
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <wincon.h>
    #include <shlwapi.h>
    #pragma comment(lib, "shlwapi.lib")
    #include <tchar.h>BOOLEAN IsFileName(LPTSTR pszFileName)
    {
    if(pszFileName == NULL ||
       *pszFileName == TEXT('\0')) {
    return FALSE;
    }
    if(*pszFileName == TEXT('.') &&
       (*(pszFileName+1) == TEXT('\0') ||
        *(pszFileName+1) == TEXT('.') &&
        *(pszFileName+2) == TEXT('\0'))) {
    return FALSE;
    }
    return TRUE;
    }int FindFiles(LPTSTR pszPath)
    {
    HANDLE hFindFile;
    WIN32_FIND_DATA FindData;
    TCHAR szCurrPath[MAX_PATH+1];
    TCHAR szNextPath[MAX_PATH+1]; PathCombine(szCurrPath, pszPath, TEXT("*"));
    hFindFile = FindFirstFile(szCurrPath, &FindData);
    if(INVALID_HANDLE_VALUE == hFindFile) {
    return -1;
        }
    do {
    if(!IsFileName(FindData.cFileName)) {
    continue;
    }
    if(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
    PathCombine(szNextPath, pszPath, FindData.cFileName);
    _tprintf(TEXT("%s: %s\n"), TEXT("path"), szNextPath);
    FindFiles(szNextPath);
    } else {
    PathCombine(szNextPath, pszPath, FindData.cFileName);
    _tprintf(TEXT("%s: %s\n"), TEXT("file"), szNextPath);
    }
    } while(FindNextFile(hFindFile, &FindData));
    FindClose(hFindFile);
    return 0;
    }int _tmain(int argc, LPTSTR argv[])
    {
    if(argc == 1) {
    _tprintf(TEXT("Usage: findfile <path>"));
    return -1;
    }
    if(!PathIsDirectory(argv[1])) {
    _tprintf(TEXT("Path \"%s\" doesn't exist."), argv[1]);
    return -1;
    }
    return FindFiles(argv[1]);
    }
    在命令行中运行编译出来的文件加路径参数,比如 findfile.exe "C:\Program Files"。
      

  5.   

    我也show一个
    /枚举一个目录
    //UNICODE
    VOID __stdcall Fl_EnmuDirectoryW(
     /*目录的完整路径,不要在后面添加 \\,例如e盘,这里的调用为 e: 不要 \\  */
     __in LPWSTR  lpDirecoryFullPath,
     //扩展名,可用通配符 *.*(同样可为NULL表示),例如 *.exe或 aaa.*等
     //如果文件没有扩展名,使用*.*才能找到
     __in LPWSTR szPrepareString, 
     //枚举lpDirecoryFullPath当前目录下得到的目录,以回调的方式通知
     __in PENUMDIRECTORYCALLBACKW pfnDirectoryCallback,
     //pfnDirectoryCallback的附加参数,可为NULL,表示不再使用
     __in LPVOID pDirectoryCallbackData,
     //枚举lpDirecoryFullPath当前目录下得到的文件,以回调的方式通知
     __in PENUMFILECALLBACKW   pfnFileCallback,
     //pfnFileCallback的附加参数,可为NULL,表示不使用
     __in LPVOID  pFileCallbackData)
    {
    if(!pfnDirectoryCallback || !pfnFileCallback) return ;//没有指定回调是不会枚举的,除非至少任意一个有效
    WCHAR *pszTemp= new WCHAR[MAX_PATH];//如果分配失败就会异常
    WIN32_FIND_DATAW* pfinddata = new WIN32_FIND_DATAW;
    HANDLE hFind=NULL;
    BOOL bok_dir=TRUE;
    BOOL bok_file=TRUE; int len=0; if(!szPrepareString)
    wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\*.*\0",lpDirecoryFullPath);
    else
    wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\%s\0",lpDirecoryFullPath,szPrepareString);
    //折衷做法,防止字符路径溢出
    len=lstrlenW(pszTemp)+1;
    if(len>MAX_PATH) {
    delete pfinddata;
    delete [] pszTemp;//如果溢出了,释放会导致异常
    return ;//溢出了,实际上从长度判断没有效果,运行时库在调用lstrlenw之前先俘获到溢出
    }
    hFind=FindFirstFileW(pszTemp,pfinddata);
    if(hFind==INVALID_HANDLE_VALUE){
    delete pfinddata;
    delete [] pszTemp;
    return ;
    }
    do{
    ZeroMemory(pszTemp,MAX_PATH*sizeof(WCHAR));
    wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\%s\0",lpDirecoryFullPath,pfinddata->cFileName);
    len=lstrlenW(pszTemp)+1;
    if(len>MAX_PATH) {
    delete pfinddata;
    delete [] pszTemp;
    return ;//-------------------
    }
    if((pfinddata->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
    ==FILE_ATTRIBUTE_DIRECTORY){
    if(pfnDirectoryCallback && bok_dir)
    bok_dir=pfnDirectoryCallback(pszTemp,pfinddata,pDirectoryCallbackData);
    }else{
    if(pfnFileCallback && bok_file)
    bok_file=pfnFileCallback(pszTemp,pfinddata,pFileCallbackData);
    }
    }while(FindNextFileW(hFind,pfinddata)&( bok_dir|bok_file));
    delete pfinddata;
    delete [] pszTemp;
    return ;
    }
      

  6.   

    FindFirstFile
    FindNextFile
    用这两个吧.CFileFind有时候会有文件占用的问题..