Click here to Skip to main content
11,432,427 members (59,554 online)
Click here to Skip to main content

Recursively listing file type information and icon

, 21 Jun 2001
Rate this:
Please Sign up or sign in to vote.
Code to recursively search folders to display file type information and icons
<!-- Download Links --> <!-- Main HTML starts here -->

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 Smile | :)

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

Share

About the Author

BLaZe

United States United States
My name is BLaZe and I have 15 years old

Comments and Discussions

 
Questionhow do i get the desired in vc .net Pin
itbuff6-Nov-06 4:33
memberitbuff6-Nov-06 4:33 
GeneralSHGetFileInfo with SHGFI_SYSICONINDEX flag doesn't work Pin
Tom42725-Feb-04 13:51
memberTom42725-Feb-04 13:51 
GeneralRe: SHGetFileInfo with SHGFI_SYSICONINDEX flag doesn't work Pin
Lilith Wong15-Jun-06 19:36
memberLilith Wong15-Jun-06 19:36 
GeneralThanks Pin
supertedusa7-Aug-03 9:26
membersupertedusa7-Aug-03 9:26 
GeneralThe icons disappear in W98. Pin
Tomas21-Apr-03 8:29
memberTomas21-Apr-03 8:29 
GeneralRe: The icons disappear in W98. Pin
Ridgeley Yu2-Jun-03 18:37
memberRidgeley Yu2-Jun-03 18:37 
GeneralRe: The icons disappear in W98. Pin
Tomas2-Jun-03 22:53
memberTomas2-Jun-03 22:53 
GeneralRe: The icons disappear in W98. Pin
Ridgeley Yu3-Jun-03 3:29
memberRidgeley Yu3-Jun-03 3:29 
GeneralRe: The icons disappear in W98. Pin
Tomas3-Jun-03 21:10
memberTomas3-Jun-03 21:10 
GeneralPatteren Matching / Multiple File selection Pin
alpu6-Mar-03 17:55
memberalpu6-Mar-03 17:55 
GeneralChanges to run on VC7 Pin
Soliant16-Feb-03 13:55
memberSoliant16-Feb-03 13:55 
Questionhow to get info like explorere properties? Pin
Reichrath17-Sep-01 21:20
memberReichrath17-Sep-01 21:20 
Good!
But do you know how to create a dialog like explorer properties. Is there any common or ATL based dialog?
Generalso good Pin
lizifeng25-Jun-01 17:31
memberlizifeng25-Jun-01 17:31 
GeneralRe: so good Pin
caifangbao25-Jun-01 17:33
membercaifangbao25-Jun-01 17:33 
GeneralRe: so good Pin
zhuwenyuan25-Jun-01 17:35
memberzhuwenyuan25-Jun-01 17:35 
GeneralRe: so good Pin
BLaZe25-Jun-01 18:08
memberBLaZe25-Jun-01 18:08 
GeneralClip Children Pin
BLaZe23-Jun-01 7:45
memberBLaZe23-Jun-01 7:45 

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.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.150428.2 | Last Updated 22 Jun 2001
Article Copyright 2001 by BLaZe
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid