Introduction
Here I developed some code that uses the CFileFind
Class to search the selected Drive or
Folder recursively and display the file information and icon in a list control.
BOOL CShellDlg::ListFile(LPCTSTR szPath)
{
CFileFind ff;
CString path = szPath;
path += "\\*.*";
BOOL res = TRUE;
CWaitCursor waiter;
if(ff.FindFile(path))
{
while(res)
{
m_List.LockWindowUpdate();
res = ff.FindNextFile();
if(!ff.IsDots())
{
counter++;
CString file = ff.GetFilePath();
int i = m_List.InsertItem(0,ff.GetFileName(),
GetIconIndex(ff.GetFilePath()));
CString size;
if (ff.GetLength64() < 1024)
size.Format("%d B",ff.GetLength());
else
{
if (ff.GetLength64() < (1024*1024))
size.Format("%3.2f KB",
(LONGLONG) ff.GetLength64() / 1024.0);
else
{
if (ff.GetLength64() < (1024*1024*1024))
size.Format("%3.2f MB",
(LONGLONG) ff.GetLength64() / (1024*1024.0));
else
size.Format("%1.2f GB",
(LONGLONG) ff.GetLength64() / (1024.0*1024*1024));
}
}
m_List.SetItemText(i,1,size);
CString type = GetTypeName(ff.GetFilePath());
m_List.SetItemText(i,2,type);
CString date;
CTime time;
ff.GetCreationTime(time);
date = time.Format("%x");
m_List.SetItemText(i,3,date);
m_List.SetItemText(i,4,ff.GetFilePath());
if(ff.IsDirectory())
{
path = ff.GetFilePath();
ListFile(path);
}
m_aniIcon.SetIcon(h_aIcon[m_icon]);
m_icon++;
if(m_icon >= ICONS)
{
m_icon = 0;
}
CString sin = ff.GetRoot();
m_SearchIN.SetWindowText(sin);
m_fFiles.SetWindowText(file);
CString found;
found.Format("%u",m_List.GetItemCount());
m_Count.SetWindowText(found);
}
}
m_List.UnlockWindowUpdate();
}
return TRUE;
}
TCHAR* CShellDlg::GetTypeName(CString strFPath)
{
SHFILEINFO sfi;
memset(&sfi, 0, sizeof(sfi));
static TCHAR lpBuff[MAX_PATH];
lpBuff[0] = TCHAR ('\0');
SHGetFileInfo (
strFPath,
0,
&sfi,
sizeof(sfi),
SHGFI_TYPENAME
);
lstrcpy(lpBuff, sfi.szTypeName);
if (lpBuff[0] == TCHAR('\0'))
{
int nDotIdx = strFPath.ReverseFind (TCHAR('.'));
int nBSIdx = strFPath.ReverseFind (TCHAR('\\'));
if (nDotIdx > nBSIdx)
{
strFPath = strFPath.Mid(nDotIdx+1);
strFPath.MakeUpper();
lstrcpy (lpBuff, strFPath + TCHAR (' '));
}
lstrcat (lpBuff, _T("File"));
}
return lpBuff;
}
int CShellDlg::GetIconIndex(const CString &csFileName)
{
SHFILEINFO sfi;
SHGetFileInfo(
(LPCTSTR)csFileName,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
return sfi.iIcon;
}
Thank you to all of you :-)