//遞歸調用遍歷目錄樹
/*頭文件*/
#include<windows.h>
#include<stdio.h>
/*預處理申明*/
#pragma comment (lib,"User32.lib") //調用User32.dll 在這裏""裏面不能有空格
/*函數申明*/
DWORD ListAllFileInDirectory( LPSTR szPath);
/* 全局變量 */
//記錄所有文件和目錄
DWORD dwTotalFileNum = 0;
/**********************************************
// DWORD ListAllFileInDirectory ( LPSTR szPath)
// 功能:遍歷目錄及所有子目錄,打印路徑
// 參數:LPSTR szPath,爲需遍歷的目錄
// 返回值:0代表執行完成,1 代表發生錯誤
***********************************************/
DWORD ListAllFileInDirectory ( LPSTR szPath)
{
CHAR szFilePath [MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hListFile;
CHAR szFullPath [MAX_PATH];
//構造代表子目錄和文件夾路徑的字符串,使用通用符"*"
lstrcpy(szFilePath, szPath);
lstrcat(szFilePath, "\\*");
//查找第一個文件目錄,獲得查找句柄
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); //找到文件的名稱
dwTotalFileNum ++;
//打印
printf("\n%d\t%s\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
{
CHAR szCurrentPath [MAX_PATH];
GetCurrentDirectory( MAX_PATH, szCurrentPath);
ListAllFileInDirectory(szCurrentPath);
}
printf("\n");
return 0;
}