Click here to Skip to main content
Licence 
First Posted 21 Jun 2001
Views 83,094
Bookmarked 29 times

Recursively listing file type information and icon

By | 21 Jun 2001 | Article
Code to recursively search folders to display file type information and icons

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 
                {
                    // The following weird LONGLONG casts are because VC 6.0
                    // doesn't implement int64 to double conversion =8-ooo
                    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 :-)

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

BLaZe



United States United States

Member

My name is BLaZe and I have 15 years old

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
Questionhow do i get the desired in vc .net Pinmemberitbuff3:33 6 Nov '06  
GeneralSHGetFileInfo with SHGFI_SYSICONINDEX flag doesn't work PinmemberTom42712:51 25 Feb '04  
GeneralRe: SHGetFileInfo with SHGFI_SYSICONINDEX flag doesn't work PinmemberLilith Wong18:36 15 Jun '06  
GeneralThanks Pinmembersupertedusa8:26 7 Aug '03  
GeneralThe icons disappear in W98. PinmemberTomas7:29 21 Apr '03  
GeneralRe: The icons disappear in W98. PinmemberRidgeley Yu17:37 2 Jun '03  
GeneralRe: The icons disappear in W98. PinmemberTomas21:53 2 Jun '03  
GeneralRe: The icons disappear in W98. PinmemberRidgeley Yu2:29 3 Jun '03  
GeneralRe: The icons disappear in W98. PinmemberTomas20:10 3 Jun '03  
GeneralPatteren Matching / Multiple File selection Pinmemberalpu16:55 6 Mar '03  
GeneralChanges to run on VC7 PinmemberSoliant12:55 16 Feb '03  
Questionhow to get info like explorere properties? PinmemberReichrath20:20 17 Sep '01  
Generalso good Pinmemberlizifeng16:31 25 Jun '01  
GeneralRe: so good Pinmembercaifangbao16:33 25 Jun '01  
GeneralRe: so good Pinmemberzhuwenyuan16:35 25 Jun '01  
GeneralRe: so good PinmemberBLaZe17:08 25 Jun '01  
GeneralClip Children PinmemberBLaZe6:45 23 Jun '01  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web03 | 2.5.120517.1 | Last Updated 22 Jun 2001
Article Copyright 2001 by BLaZe
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid