www.pudn.com > 7941966CEFind.rar > CEFind.c


//====================================================================== 
// CEFind - A Windows CE console file search application 
// 
// Written for the book Programming Windows CE 
// Copyright (C) 1998 Douglas Boling 
//====================================================================== 
#include                  // For all that Windows stuff 
 
// Returns number of elements 
#define dim(x) (sizeof(x) / sizeof(x[0]))    
 
int SrchDirectory (LPTSTR pszDir); 
//---------------------------------------------------------------------- 
// Global data 
// 
int nTotal = 0; 
int nFiles = 0; 
 
//====================================================================== 
// Program entry point 
// 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                    LPWSTR lpCmdLine, int nCmdShow) { 
    TCHAR pInput[256]; 
 
    if (wcslen (lpCmdLine) == 0) { 
        printf ("USAGE: CEFIND filespec\n"); 
        return 0; 
    } 
    printf ("\n");                         // Initialize the console. 
    // We always start at the root. 
    if (*lpCmdLine != TEXT ('\\')) { 
        pInput[0] = TEXT ('\\'); 
    } else 
        pInput[0] = L'\0'; 
    wcscat (pInput, lpCmdLine); 
 
    // Perform recursive search. 
    SrchDirectory (pInput); 
 
    wprintf (L"\n  %9d file(s) found.   %d bytes.\n", nFiles, nTotal); 
    return 0; 
} 
//---------------------------------------------------------------------- 
// SrchDirectory - Recursive routine that searches a dir and all 
// child dirs for matching files 
// 
int SrchDirectory (LPTSTR pszDir) { 
    WIN32_FIND_DATA fd; 
    TCHAR szNew[MAX_PATH]; 
    INT i, rc, nErr = 0; 
    HANDLE hFind; 
    TCHAR *pPtr, *pSrcSpec; 
 
    // Separate subdirectory from search specification. 
    for (pSrcSpec = pszDir + lstrlen (pszDir); pSrcSpec >= pszDir;  
         pSrcSpec--) 
        if (*pSrcSpec == TEXT ('\\')) 
            break; 
 
    // Copy the search specification up to the last directory 
    // separation character. 
    if (pSrcSpec <= pszDir) 
        lstrcpy (szNew, TEXT ("\\")); 
    else { 
        for (i = 0; (i < dim(szNew)-10) &&  
                    ((pszDir+i) <= pSrcSpec); i++) 
            szNew[i] = *(pszDir+i); 
        szNew[i] = TEXT ('\0'); 
    } 
    pPtr = szNew + lstrlen (szNew); 
 
    // Find matching files. 
    hFind = FindFirstFile (pszDir, &fd); 
    if (hFind != INVALID_HANDLE_VALUE) { 
 
        do { 
            // Report all matching files. 
            if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { 
                wprintf (L"  %9d\t %s%s\n", fd.nFileSizeLow, szNew,  
                         fd.cFileName); 
                nTotal += fd.nFileSizeLow; 
                nFiles++; 
            } 
 
            rc = FindNextFile (hFind, &fd); 
        } while (rc); 
 
        FindClose (hFind); 
    } else { 
        rc = GetLastError(); 
        if ((rc != ERROR_FILE_NOT_FOUND)  &&  
            (rc != ERROR_NO_MORE_FILES)) { 
            wprintf (L"1Find Error.  Str:%s rc:%d", pszDir, rc); 
            return -1; 
        } 
    } 
 
    // Create generic search string for all directories. 
    lstrcat (szNew, TEXT ("*.*")); 
 
    hFind = FindFirstFile (szNew, &fd); 
    if (hFind != INVALID_HANDLE_VALUE) { 
        do { 
            if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { 
                // Recurse to the lower directory 
                lstrcpy (pPtr, fd.cFileName); 
                lstrcat (pPtr, pSrcSpec); 
                nErr = SrchDirectory (szNew); 
                if (nErr) break; 
                *pPtr = TEXT ('\0'); 
            } 
            rc = FindNextFile (hFind, &fd); 
        } while (rc); 
 
        FindClose (hFind); 
    } else { 
        rc = GetLastError(); 
        if ((rc != ERROR_FILE_NOT_FOUND) &&  
            (rc != ERROR_NO_MORE_FILES)) { 
            wprintf (L"2Find Error:%d", rc); 
            return -1; 
        } 
    } 
    return nErr; 
}