采用vector建立栈的方式,打印文件夹下所有文件名称(FindFirstFile与FindNextFile的使用)

时间:2022-07-18 22:05:39

HANDLE WINAPI FindFirstFile(  _In_   LPCTSTR lpFileName,  _Out_  LPWIN32_FIND_DATA lpFindFileData);
FindFirstFile()用于查找当前目录下的第一个文件名称,返回一个句柄
FineNextFile()利用上面返回的句柄查找当前目录中的下一个文件




//文件属性信息
//#define FILE_SHARE_READ                   0x00000001  //#define FILE_SHARE_WRITE                  0x00000002  //#define FILE_SHARE_DELETE                  0x00000004  //#define FILE_ATTRIBUTE_READONLY             0x00000001  //#define FILE_ATTRIBUTE_HIDDEN              0x00000002  //#define FILE_ATTRIBUTE_SYSTEM              0x00000004  //#define FILE_ATTRIBUTE_DIRECTORY            0x00000010  //#define FILE_ATTRIBUTE_ARCHIVE              0x00000020  //#define FILE_ATTRIBUTE_DEVICE              0x00000040  //#define FILE_ATTRIBUTE_NORMAL              0x00000080  //#define FILE_ATTRIBUTE_TEMPORARY            0x00000100  //#define FILE_ATTRIBUTE_SPARSE_FILE           0x00000200  //#define FILE_ATTRIBUTE_REPARSE_POINT          0x00000400  //#define FILE_ATTRIBUTE_COMPRESSED            0x00000800  //#define FILE_ATTRIBUTE_OFFLINE              0x00001000  //#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED       0x00002000  //#define FILE_ATTRIBUTE_ENCRYPTED            0x00004000  //#define FILE_ATTRIBUTE_INTEGRITY_STREAM         0x00008000  //#define FILE_ATTRIBUTE_VIRTUAL              0x00010000  //#define FILE_ATTRIBUTE_NO_SCRUB_DATA          0x00020000
#include <Windows.h>#include <vector>#include <iostream>#include "string"using std::vector;using namespace std;void PrintAllFileName(string start);int main(){  string           start           = "E:";PrintAllFileName(start);    getchar();return 0;}//打印文件夹下所有普通文件文件名void PrintAllFileName(string start){HANDLE           hFile;WIN32_FIND_DATA  FindFileData;string           strpush;//定义缓存空间存放文件夹信息vector<string>tchFileName;//将顶层目录路径压入栈中tchFileName.push_back(start); while (!tchFileName.empty()){//提取tchFileName栈顶目录信息strpush = tchFileName.back();//删除栈顶目录信息tchFileName.pop_back();//查找该目录下第一个文件hFile = FindFirstFile(((strpush + "\\*.*").c_str()), &FindFileData);tchFileName.size();//没有查找到文件if (hFile == INVALID_HANDLE_VALUE){continue;}//目录文件   //if判断语句中必须使用&操作符if ((FindFileData.cFileName[0] != '.' )          //用来过滤上层和下层目录名称&&!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)&&!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)){if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){//普通目录  将文件索引保存到tchFileName栈中tchFileName.push_back(strpush + "\\" + FindFileData.cFileName);}else{//普通文件  打印文件名cout<<FindFileData.cFileName<<endl;  }}//判断该目录下是否还有其他文件while(FindNextFile(hFile, &FindFileData)){//目录文件if ((FindFileData.cFileName[0] != '.' )&&!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)&&!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)){if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){//普通目录  将文件索引保存到tchFileName栈中tchFileName.push_back(strpush + "\\" + FindFileData.cFileName);}else{//普通文件  打印文件名cout<<FindFileData.cFileName<<endl;  }} }}::FindClose(hFile);}