win32下,递归遍历目录树
以下代码取自《Windows API开发详解》,修改、屏蔽了报错部分内容,可在Visual Studio 2015上运行,屏蔽了无法运行部分。
/*********************************************************
* tree.c 递归遍历目录树
**********************************************************/
/* 头文件 */
#include <Windows.h>
#include <stdio.h>
/* 预处理声明 */
#pragma comment (lib, "User32.lib")
/* 函数声明 */
DWORD ListAllFileInDirectory(LPWSTR szPath);
/* 全局变量 */
// 记录所有的文件和目录
DWORD dwTotalFileNum = 0;
/*********************************************************
* DWORD ListAllFileInDirectory(LPSTR szPath)
* 功能:遍历目录及所有子目录,打印路径
* 参数:LPSTR szPath,为需遍历的目录
* 返回值:0代表执行完成,1代表发生错误
*********************************************************/
DWORD ListAllFileInDirectory(LPWSTR szPath)
{
WCHAR szFilePath[MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hListFile;
WCHAR szFullPath[MAX_PATH];
// 构造代表子目录和文件夹路径的字符串,使用通配符“*”
lstrcpy(szFilePath, szPath);
lstrcat(szFilePath, L"\\*");
// 查找第一个文件目录,获得查找句柄
hListFile = FindFirstFile(szFilePath, &FindFileData);
if (hListFile == INVALID_HANDLE_VALUE)
{
printf("错误: %d", GetLastError());
return 1;
}
else
{
do {
// 过滤"."和"..",不需要遍历
if (lstrcmp(FindFileData.cFileName, TEXT(".")) == 0 ||
lstrcmp(FindFileData.cFileName, TEXT("..")) == 0)
{
continue;
}
// 构造成全路径
//wsprintf(szFullPath, "%s\\%s", szPath, FindFileData.cFileName);
lstrcpy(szFullPath, szPath);
lstrcat(szFullPath, L"\\");
lstrcat(szFullPath, FindFileData.cFileName);
dwTotalFileNum++;
// 打印
printf("\n%d\t%ws\t", dwTotalFileNum, szFullPath);
// 如果是目录,则递归调用,列举下级目录
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
printf("<DIR>");
ListAllFileInDirectory(szFullPath);
}
} while (FindNextFile(hListFile, &FindFileData));
}
return 0;
}
/***************************************************************
* int main(int argc, PCHAR argv[])
*
* 功能:调用ListAllFileInDirectory遍历目录下的文件和子目录
*
* 参数:argv[1]为需遍历的路径,如果为空则获取当前路径
***************************************************************/
int main(int argc, PCHAR argv[])
{
//if (argc == 2)
//{
// ListAllFileInDirectory(argv[1]);
//}
//else
{
WCHAR szCurrentPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH, szCurrentPath);
ListAllFileInDirectory(szCurrentPath);
}
return 0;
}