使用WIN32 API 来遍历指定目录下的所有文件并返回:
.h
#include <Windows.h>
#include <stdio.h>
#include <vector>
#include <iostream>
/*
* DWORD EnumerateFileInDirectory(LPSTR szPath)
* 功能:遍历目录下的文件和子目录,将显示文件和文件夹隐藏、加密的属性
*
* 参数:LPSTR szPath,为需遍历的路径
* 参数:std::vector<std::wstring>& vFileList,为遍历的结果
*
* 返回值:0代表执行完成,1代表发送错误
*/
DWORD EnumerateFileInDirectory(LPWSTR szPath, std::vector<std::wstring>& vFileList);
.cpp
#include "stdafx.h"
#include "tWinFile.h"
DWORD EnumerateFileInDirectory(LPWSTR szPath, std::vector<std::wstring>& vFileList)
{
WIN32_FIND_DATA FindFileData;
HANDLE hListFile;
WCHAR szFilePath[MAX_PATH];
// 构造代表子目录和文件夹路径的字符串,使用通配符"*"
lstrcpyW(szFilePath, szPath);
// 注释的代码可以用于查找所有以“.txt”结尾的文件
// lstrcat(szFilePath, "\\*.txt");
lstrcat(szFilePath, L"\\*");
// 查找第一个文件/目录,获得查找句柄
hListFile = FindFirstFile(szFilePath, &FindFileData);
// 判断句柄
if(hListFile == INVALID_HANDLE_VALUE)
{
wprintf(L"遍历文件错误:%d\n", GetLastError());
return 1;
}
else
{
do
{
/* 如果不想显示代表本级目录和上级目录的“.”和“..”,
可以使用注释部分的代码过滤
if(lstrcmp(FindFileData.cFileName, TEXT(".")) == 0 ||
lstrcmp(FindFileData.cFileName, TEXT("..")) == 0)
{
continue;
}
*/
// 打印文件名、目录名
//printf("%ws\t\t", FindFileData.cFileName);
/*
// 判断文件属性,是否为加密文件或者文件夹
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED)
{
printf("<加密> ");
}
// 判断文件属性,是否为隐藏文件或文件夹
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
{
printf("<隐藏> ");
}
// 判断文件属性,是否为目录
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
printf("<DIR> ");
}
// 读者可根据文件属性表中的内容自行添加、判断文件属性
printf("\n");
*/
if(lstrcmp(FindFileData.cFileName, TEXT(".")) == 0 ||
lstrcmp(FindFileData.cFileName, TEXT("..")) == 0)
{
continue;
}
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
WCHAR szNextDir[MAX_PATH] = {0};
lstrcpyW(szNextDir, szPath);
lstrcatW(szNextDir, L"\\");
lstrcatW(szNextDir, FindFileData.cFileName);
EnumerateFileInDirectory(szNextDir, vFileList);
}
else
{
std::wstring filePath;
filePath.resize(MAX_PATH);
lstrcpyW(&filePath[0], szPath);
lstrcatW(&filePath[0], L"\\");
lstrcatW(&filePath[0], FindFileData.cFileName);
vFileList.push_back(filePath);
}
}
while(FindNextFile(hListFile, &FindFileData));
}
return 0;
}