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; }