|
|
//
// WALKPATH.C
//
#include "sigverif.h"
LPDIRNODE g_lpDirList = NULL; LPDIRNODE g_lpDirEnd = NULL; BOOL g_bRecurse = TRUE;
//
// This function takes a directory name and a search pattern and looks for all files mathching the pattern.
// If bRecurse is set, then it will add subdirectories to the end of the g_lpDirList for subsequent traversal.
//
// In this routine we allocate and fill in some of the lpFileNode values that we know about.
//
void FindFile(DIRNODE *lpDir, TCHAR *lpDirName, TCHAR *lpFileName) { DWORD dwRet; BOOL bOk = TRUE; HANDLE hFind; LPFILENODE lpFileNode; LPDIRNODE lpDirNode; WIN32_FIND_DATA FindFileData;
// If the user clicked STOP, then bail immediately!
// If the directory is bogus, then skip to the next one.
if (!g_App.bStopScan && SetCurrentDirectory(lpDirName)) { // If the user wants to look in subdirectories, then we need to find everything in the current directory
// and if it's a directory we want to add it to the end of the g_lpDirList.
if (g_bRecurse) { hFind = FindFirstFile(TEXT("*.*"), &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { bOk = TRUE; while (bOk && !g_App.bStopScan) { if (lstrcmp(FindFileData.cFileName, TEXT(".")) && lstrcmp(FindFileData.cFileName, TEXT("..")) && (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { lpDirNode = (LPDIRNODE) MALLOC(sizeof(DIRNODE));
if (lpDirNode) { dwRet = GetFullPathName(FindFileData.cFileName, MAX_PATH, lpDirNode->DirName, 0); if (!dwRet || dwRet >= MAX_PATH) { GetShortPathName(lpDirName, lpDirNode->DirName, MAX_PATH); GetFullPathName(FindFileData.cFileName, MAX_PATH, lpDirNode->DirName, 0); SetCurrentDirectory(lpDirName); } }
g_lpDirEnd->next = lpDirNode; g_lpDirEnd = lpDirNode; }
bOk = FindNextFile(hFind, &FindFileData); } FindClose(hFind); } }
// We have added any subdirectories to the dir list, so now we can actually look for
// the lpFileName search pattern and start adding to the g_App.lpFileList.
hFind = FindFirstFile(lpFileName, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { bOk = TRUE;
// While there are more files to be found, keep looking in the directory...
while (bOk && !g_App.bStopScan) { if (lstrcmp(FindFileData.cFileName, TEXT(".")) && lstrcmp(FindFileData.cFileName, TEXT("..")) && !(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { //
// Allocate an lpFileNode, fill it in, and add it to the end of g_App.lpFileList
//
// We need to call CharLowerBuff on the file and dir names because
// the catalog files all contain lower-case names for the files.
//
lpFileNode = CreateFileNode(lpDirName, FindFileData.cFileName);
if (lpFileNode) { if (!g_App.lpFileList) g_App.lpFileList = lpFileNode; else g_App.lpFileLast->next = lpFileNode; g_App.lpFileLast = lpFileNode; // Increment the total number of files we've found that meet the search criteria.
g_App.dwFiles++; } }
// Get the next file meeting the search pattern.
bOk = FindNextFile(hFind, &FindFileData); } FindClose(hFind); } }
// Free the memory allocated in the directory node.
lpDir = g_lpDirList; g_lpDirList = g_lpDirList->next; FREE(lpDir); }
//
// Build an g_App.lpFileList given the user settings in the main dialog.
//
void BuildFileList(LPTSTR lpPathName) { TCHAR FileName[MAX_PATH]; TCHAR Extension[MAX_PATH]; LPTSTR lpFileName = FileName; LPTSTR lpExtension = Extension; LPDIRNODE lpDirNode;
// Check if this is a valid starting directory.
// If not, then pop up an error message.
if (!SetCurrentDirectory(lpPathName)) { MyErrorBoxId(IDS_BADDIR); return; }
// If the "Include Subdirectories" is checked, then bRecurse is TRUE.
if (g_App.bSubFolders) g_bRecurse = TRUE; else g_bRecurse = FALSE;
// Get the search pattern from the resource or the user-specified string
if (g_App.bUserScan) lstrcpy(lpFileName, g_App.szScanPattern); else MyLoadString(lpFileName, IDS_ALL);
// Allocate the first entry in the g_lpDirList and set it to the
// current directory.
lpDirNode = (LPDIRNODE) MALLOC(sizeof(DIRNODE));
if (lpDirNode) { lstrcpy(lpDirNode->DirName, lpPathName); lpDirNode->next = NULL; }
g_lpDirList = lpDirNode; g_lpDirEnd = lpDirNode;
// Process the g_lpDirList as long as the user doesn't click STOP!
while (g_lpDirList && !g_App.bStopScan) FindFile(g_lpDirList, g_lpDirList->DirName, lpFileName);
// Make sure all the memory allocated to the g_lpDirList is freed.
while (g_lpDirList) { lpDirNode = g_lpDirList->next; FREE(g_lpDirList); g_lpDirList = lpDirNode; }
// If there weren't any files found, then let the user know about it.
if (!g_App.lpFileList) MyMessageBoxId(IDS_NOFILES); }
|