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;
}