VCpp遍历文件夹下的所有文件,包含子目录

⌚Time: 2023-01-08 23:53:24

👨‍💻Author: Jack Ge

建立一个测试目录,使用tree命令查看目录结构

使用FindFirstFile、FindNextFile、FindClose进行搜索文件


HANDLE FindFirstFileA(

  [in]  LPCSTR             lpFileName,

  [out] LPWIN32_FIND_DATAA lpFindFileData

);

[in] lpFileName

目录或路径以及文件名。 文件名可以包含通配符,例如星号 (*) 或问号 (?) 。

[out] lpFindFileData

指向 WIN32_FIND_DATA结构的指针 ,该结构接收有关找到的文件或目录的信息。

如果函数成功,则返回值是在对 FindNextFile 或 FindClose 的后续调用中使用的搜索句柄, 而 lpFindFileData 参数包含有关找到的第一个文件或目录的信息

BOOL FindNextFileA(

  [in]  HANDLE             hFindFile,

  [out] LPWIN32_FIND_DATAA lpFindFileData

);

[in] hFindFile

前一次调用 FindFirstFile 或 FindFirstFileEx 函数返回的搜索句柄。

[out] lpFindFileData

指向 WIN32_FIND_DATA结构的指针 ,该结构接收有关找到的文件或子目录的信息。

BOOL FindClose(

  [in, out] HANDLE hFindFile

);

[in, out] hFindFile

文件搜索句柄。

搜索的文件信息储存在WIN32_FIND_DATA结构体中


typedef struct _WIN32_FIND_DATAW {

  DWORD    dwFileAttributes;

  FILETIME ftCreationTime;

  FILETIME ftLastAccessTime;

  FILETIME ftLastWriteTime;

  DWORD    nFileSizeHigh;

  DWORD    nFileSizeLow;

  DWORD    dwReserved0;

  DWORD    dwReserved1;

  WCHAR    cFileName[MAX_PATH];

  WCHAR    cAlternateFileName[14];

  DWORD    dwFileType; // Obsolete. Do not use.

  DWORD    dwCreatorType; // Obsolete. Do not use

  WORD     wFinderFlags; // Obsolete. Do not use

} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;

其中dwFileAttributes可以是


●FILE_ATTRIBUTE_ARCHIVE——文件包含归档属性。

●FILE_ATTRIBUTE_COMPRESSED——文件和目录被压缩。

●FILE_ATTRIBUTE_DIRECTORY——找到的是一个目录。

●FILE_ATTRIBUTE_HIDDEN——文件包含隐含属性。

●FILE_ATTRIBUTE_NORMAL——文件没有其他属性。

●FILE_ATTRIBUTE_READONLY——文件包含只读属性。

●FILE_ATTRIBUTE_SYSTEM——文件包含系统属性。

●FILE_ATTRIBUTE_TEMPORARY——文件是一个临时文件。

搜索当前目录的所有文件

...代表当前文件夹和上一级文件夹,不显示




#include <windows.h>

#include <string>

#include <stdio.h>

using namespace std;



int main(){

    string sPath = "D:\\test\\*";

    HANDLE file;    

    WIN32_FIND_DATA fileData;    

    file = FindFirstFile(sPath.c_str(), &fileData);

    if (file != INVALID_HANDLE_VALUE)

    {

        if(strcmp(fileData.cFileName,".") == 0||strcmp(fileData.cFileName,"..") == 0){

            ;   

        }else if(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){

            printf("发现目录:%s\n",fileData.cFileName);

        }else{

            printf("发现文件:%s\n",fileData.cFileName);

        }

        bool bState = false;

        bState = FindNextFile(file, &fileData);    

        while(bState){

            if(strcmp(fileData.cFileName,".") == 0||strcmp(fileData.cFileName,"..") == 0){

            ;   

        }else if(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){

            printf("发现目录:%s\n",fileData.cFileName);

        }else{

            printf("发现文件:%s\n",fileData.cFileName);

        }

            bState = FindNextFile(file, &fileData);    

        }

    }

    else

    {

        printf("当前目录无相关文件!\n");

    }

    

    FindClose(file);

    return 0;

}

测试

使用递归遍历子目录所有文件




#include <windows.h>

#include <string>

#include <stdio.h>

using namespace std;

void find_file(string sDir){



    HANDLE file;    

    WIN32_FIND_DATA fileData;

    file = FindFirstFile((sDir+"*").c_str(), &fileData);

    if (file != INVALID_HANDLE_VALUE)

    {

        if(strcmp(fileData.cFileName,".") == 0||strcmp(fileData.cFileName,"..") == 0){

            ;   

        }else if(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){

            printf("进入目录:%s\n",fileData.cFileName);

            find_file(sDir+"\\"+fileData.cFileName+"\\");

            printf("离开目录:%s\n",fileData.cFileName);

        }else{

            printf("发现文件:%s\n",fileData.cFileName);

        }

        bool bState = false;

        bState = FindNextFile(file, &fileData);    

        while(bState){

            if(strcmp(fileData.cFileName,".") == 0||strcmp(fileData.cFileName,"..") == 0){

                ;   

            }else if(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){

                printf("进入目录:%s\n",fileData.cFileName);

                

                find_file(sDir+"\\"+fileData.cFileName+"\\");

                printf("离开目录:%s\n",fileData.cFileName);

            }else{

                printf("发现文件:%s\n",fileData.cFileName);

            }

            bState = FindNextFile(file, &fileData);    

        }

    }else{

        printf("当前目录无相关文件!\n");

    }

    

    FindClose(file);

}

int main(){

    find_file("D:\\test\\");

    return 0;

}

遍历目录包括子目录下所有特定文件类型,如txt文件




#include <windows.h>

#include <string>

#include <vector>



using namespace std;



//全局变量

vector<string> g_vFilePath;

//遍历搜索文件 包含子目录

void find_file_current_dir(string sDir,string fileType){

 

    HANDLE file;    

    WIN32_FIND_DATA fileData;    

    file = FindFirstFile((sDir+"*"+fileType).c_str(), &fileData);

    if (file != INVALID_HANDLE_VALUE)

    {

        if(strcmp(fileData.cFileName,".") == 0||strcmp(fileData.cFileName,"..") == 0){

            ;   

        }else if(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){

        }else{

            printf("发现\(%s\)文件:%s\n",fileType.c_str(),fileData.cFileName);

            string sTemp;

            sTemp += sDir;

            sTemp += fileData.cFileName;

            g_vFilePath.push_back(sTemp);

        }

        bool bState = false;

        bState = FindNextFile(file, &fileData);    

        while(bState){

            if(strcmp(fileData.cFileName,".") == 0||strcmp(fileData.cFileName,"..") == 0){

            ;   

        }else if(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){

        }else{

            printf("发现\(%s\)文件:%s\n",fileType.c_str(),fileData.cFileName);

            string sTemp;

            sTemp += sDir;

            sTemp += fileData.cFileName;

            g_vFilePath.push_back(sTemp);

        }

            bState = FindNextFile(file, &fileData);    

        }

    }

    else

    {

        printf("当前目录无相关文件!\n");

    }

    

    FindClose(file);

    

}

void find_file(string sDir,string fileType){

    //获取当前目录下的所有特定文件

    find_file_current_dir(sDir,fileType);

    //遍历所有目录

    HANDLE file;    

    WIN32_FIND_DATA fileData;

    file = FindFirstFile((sDir+"*").c_str(), &fileData);

    if (file != INVALID_HANDLE_VALUE)

    {

        if(strcmp(fileData.cFileName,".") == 0||strcmp(fileData.cFileName,"..") == 0){

            ;   

        }else if(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){

            printf("进入目录:%s\n",fileData.cFileName);

            find_file(sDir+fileData.cFileName+"\\",fileType);   

            printf("离开目录:%s\n",fileData.cFileName);

        }

        bool bState = false;

        bState = FindNextFile(file, &fileData);    

        while(bState){

            if(strcmp(fileData.cFileName,".") == 0||strcmp(fileData.cFileName,"..") == 0){

            ;   

            }else if(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){

                printf("进入目录:%s\n",fileData.cFileName);

                find_file(sDir+fileData.cFileName+"\\",fileType);   

                printf("离开目录:%s\n",fileData.cFileName);

            }

            bState = FindNextFile(file, &fileData);    

        }

    }else{

        printf("当前目录无相关文件!\n");

    }

    

    FindClose(file);

}

int main(int argc,char* argv[]){

    //查找D:\\text\\文件夹下的所有txt文件

    //清空容器并释放空间

    vector<string>().swap(g_vFilePath);

    printf("开始文件搜索:\n");

    find_file("D:\\test\\",".txt");

    printf("文件搜索结果:\n");

    for(vector<string>::iterator iter = g_vFilePath.begin();iter!=g_vFilePath.end();iter++){

        printf("%s\n",iter->c_str());

    }

    return 0;

}