建立一个测试目录,使用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;
}
