170 lines
6 KiB
C
170 lines
6 KiB
C
|
//
|
||
|
// 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);
|
||
|
}
|