win32下,遍歷目錄下的文件和子目錄
以下代碼取自《Windows API開發詳解》,修改、屏蔽了報錯部分內容,可在Visual Studio 2015上運行,屏蔽了無法運行部分。
/*
* sub_dir.c 遍歷目錄下的文件和子目錄
*/
#include <Windows.h>
#include <stdio.h>
/*
* DWORD EnumerateFileInDirectory(LPSTR szPath)
* 功能:遍歷目錄下的文件和子目錄,將顯示文件和文件夾隱藏、加密的屬性
*
* 參數:LPSTR szPath,爲需遍歷的路徑
*
* 返回值:0代表執行完成,1代表發送錯誤
*/
DWORD EnumerateFileInDirectory(LPWSTR szPath)
{
WIN32_FIND_DATA FindFileData;
HANDLE hListFile;
WCHAR szFilePath[MAX_PATH];
// 構造代表子目錄和文件夾路徑的字符串,使用通配符"*"
lstrcpy(szFilePath, szPath);
// 註釋的代碼可以用於查找所有以“.txt”結尾的文件
// lstrcat(szFilePath, "\\*.txt");
lstrcat(szFilePath, L"\\*");
// 查找第一個文件/目錄,獲得查找句柄
hListFile = FindFirstFile(szFilePath, &FindFileData);
// 判斷句柄
if(hListFile == INVALID_HANDLE_VALUE)
{
printf("錯誤:%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");
}
while(FindNextFile(hListFile, &FindFileData));
}
return 0;
}
/*
* int main(int argc, PCHAR argv[])
* 功能:調用ListFileInDirectory遍歷目錄下的文件和子目錄
* 參數:argv[1]爲需要遍歷的路徑,如果爲空,則獲取當前路徑
*/
int main(int argc, PCHAR argv[])
{
//if (argc == 2)
//{
// EnumerateFileInDirectory(argv[1]);
//}
//else
{
WCHAR szCurrentPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH, szCurrentPath);
EnumerateFileInDirectory(szCurrentPath);
}
return 0;
}