#define LINE_TAG _T("\r\n")
int g_iLevel = -1;
//0: file 1:folder
CString GetToken(int iFlag)
{
CString strToken;
for(int i = 0; i < g_iLevel; i++)
{
strToken += _T(" ");
}
if(iFlag == 0)
{
strToken += _T("|");
}
return strToken;
}
CString EnumFiles()
{
g_iLevel++;
WIN32_FIND_DATA fd;
HANDLE handle = ::FindFirstFile(_T("*.*"), &fd);
CString strFolders, strFiles;
strFiles.Empty();
strFolders.Empty();
if(INVALID_HANDLE_VALUE != handle)
{
do{
CString strFolder, strFile;
strFile.Empty();
strFolder.Empty();
if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
CString strName = fd.cFileName;
if(strName != _T(".") && strName != _T(".."))
{//文件夹
strFolder = GetToken(1);
strFolder += _T("+ ");
strFolder += strName + LINE_TAG;
::SetCurrentDirectory(strName);
strFolder += EnumFiles();
::SetCurrentDirectory(_T(".."));
}
}
else
{//文件
strFile = GetToken(0);
strFile += fd.cFileName;
strFile += LINE_TAG;
}
strFiles += strFile;
strFolders += strFolder;
}while(FindNextFile(handle, &fd));
::FindClose(handle);
}
g_iLevel--;
return CString(strFiles + strFolders);
}
效果图: