BOOL ShowDirectory(LPCWSTR directory)
{
WIN32_FIND_DATA FindFileData = { 0 }; //FindFirstFile FindNextFile参数2
HANDLE hFind = NULL; //FindFirstFile返回值
TCHAR wOriginalPath[MAX_PATH+2] = {0}; //用于拼接当前路径
TCHAR wCurrentFile[MAX_PATH + 2] = { 0 }; //用于拼接当前查询到的文件或文件夹
LPCWSTR pCurrentlPath = directory; //用于判断当前文件路径结尾
LPCWSTR pFileName = NULL; //用于判断文件名结尾
UINT uPathCount = 0; //用于统计当前目录下.与..的个数
//拼接路径
//加上\\*后查询 -> 加等于查询该目录下第一个文件
//1 目录存在 有文件则查询成功
//2 目录存在 无文件则查询失败,既无显示数据
//3 目录不存在则失败,无显示内容
pCurrentlPath += wcslen(directory);
if (pCurrentlPath == directory) return FALSE; //说明字符长度为0
if (wcscpy_s(wOriginalPath, MAX_PATH+2,directory)) return FALSE; //拷贝目录
pCurrentlPath--;
if (*pCurrentlPath == '\\')
wcscat_s(wOriginalPath, MAX_PATH + 2,L"*");
else
wcscat_s(wOriginalPath, MAX_PATH + 2, L"\\*");
// 判断路径是否存在,此时已经开始查询目录下的第一个文件
hFind = FindFirstFile(wOriginalPath, &FindFileData);
if (INVALID_HANDLE_VALUE == hFind)
return FALSE;
//获取当前目录下文件,判断属性是否为文件夹
//文件夹 -> 进入遍历
//文件 -> 打印
//.或..则不打印
do
{
swprintf_s(wCurrentFile, MAX_PATH + 2, L"%s%s%s", directory, L"\\", FindFileData.cFileName);
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //为0则不是文件夹
{
//文件夹
//.与..隐藏
if (uPathCount < 2) {
pFileName = FindFileData.cFileName;
pFileName += wcslen(FindFileData.cFileName);
if (pFileName == FindFileData.cFileName) continue; //说明字符长度为0
if (*--pFileName == L'.')
{
uPathCount++;
continue; //遇到.退出当前循环
}
}
ShowDirectory(wCurrentFile);
}
else
{
wprintf(L"%s\n", wCurrentFile);
}
ZeroMemory(wCurrentFile, MAX_PATH + 2);
} while (FindNextFile(hFind, &FindFileData));
FindClose(hFind);
return TRUE;
}