#define _CRT_SECURE_NO_WARNINGS #include #include #include void searchFiles(const TCHAR* folder, const TCHAR* searchString) { WIN32_FIND_DATA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE; TCHAR DirSpec[MAX_PATH]; DWORD dwError; _stprintf_s(DirSpec, MAX_PATH, _T("%s\\*"), folder); hFind = FindFirstFile(DirSpec, &FindFileData); if (hFind == INVALID_HANDLE_VALUE) { _tprintf(_T("Invalid file handle. Error is %u\n"), GetLastError()); } else { do { if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (_tcscmp(FindFileData.cFileName, _T(".")) != 0 && _tcscmp(FindFileData.cFileName, _T("..")) != 0) { _stprintf_s(DirSpec, MAX_PATH, _T("%s\\%s"), folder, FindFileData.cFileName); searchFiles(DirSpec, searchString); } } else { // Open the file and search for the string TCHAR filePath[MAX_PATH]; _stprintf_s(filePath, MAX_PATH, _T("%s\\%s"), folder, FindFileData.cFileName); FILE* file; errno_t err = _tfopen_s(&file, filePath, _T("r")); if (err != 0) { _tprintf(_T("Failed to open file: %s\n"), filePath); } else { TCHAR buffer[1024]; if (file != 0) { while (_fgetts(buffer, sizeof(buffer) / sizeof(TCHAR), file) != NULL) { if (_tcsstr(buffer, searchString) != NULL) { _tprintf(_T("Found in file: %s\n"), filePath); break; } } fclose(file); } } } } while (FindNextFile(hFind, &FindFileData) != 0); dwError = GetLastError(); FindClose(hFind); if (dwError != ERROR_NO_MORE_FILES) { _tprintf(_T("FindNextFile error. Error is %u\n"), dwError); } } } int _tmain(int argc, TCHAR* argv[]) { const TCHAR* folderPath = _T("C:\\Users\\SEEDAGX\\source\\repos\\Grep"); const TCHAR* searchString = _T("Grep"); searchFiles(folderPath, searchString); return 0; }