//递归调用遍历目录树
/*头文件*/
#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;
}