Вот я понаписал небольшую процедурку для сего действа;) Правда с коментариями облом :(( оформление портят, но тут и так все с первого взгляда понятно Тем не менее, расскажу чего мы в функцию передаем: тек-с: lpFilename - это имя файлика, в котором искать бум :) lpTextToFind - вообще в начале хотел назвать это lpTextToSearchFor, но передумал почему-то:( Главное правило :) не коментируй то, что и так понятно ;-) мы ему не последуем =) bool bCaseSend - поиск с учетом регистра букв или без онного... bool bContinueSearch - будет ли наш поиск продолжен после того, как нашли одно слово void FunctionToCall(HANDLE hFile, DWORD dwOffset, DWORD dwSize) - это у нас функция %) будет вызвана если че-нить найдем в неё передадим дескриптор файла(hFile), смещение от начала файла до начала слова(dwOffset), и длина слова(dwSize)
Терь небольшая заметка :) Этот код не особо тестился, так что может немного подглючивать ;\ Этим можно искать не токо текст, а еще и байты в файле;) Сие не буит работать с огромными файлами (хотя, как мне кажется, мы не будем искать текст в файле больше 4Гб ;) ) З.Ы. в проекте это лучше сморится
int SearchText (LPCSTR lpFilename, LPCSTR lpTextToFind, bool bCaseSens, bool bContinueSearch, void FunctionToCall(HANDLE hFile, DWORD dwOffset, DWORD dwSize)) { //для начала выясним, скок ж букв в слове, которое найти надо unsigned int uTextLength = (int)strlen(lpTextToFind); //и так приступим :) сначала нам надо открыть файл для поиска ;) HANDLE hFile = CreateFile ( lpFilename, //Это имя нашего файла GENERIC_READ|GENERIC_WRITE, //Мы его хотим читать и писать FILE_SHARE_READ, //Разрешим другим прогам наш файл читать NULL, //И никаких атрибутов безопасности нам не надо OPEN_EXISTING, //Тек-с...надо открыть существующий файл //и если этого сделать не выйдет, то вывалится с ошибкой ;) FILE_FLAG_SEQUENTIAL_SCAN, //А это такой ужжжас ;) Скажем операционке, что хотим //читать файл от начала и до конца последовательно;) NULL); //Ну и всяких темплейтов на не надо //открылся ли файл? if (hFile == INVALID_HANDLE_VALUE) { DWORD dwError = GetLastError (); AfxMessageBox ("Оппа...Файл-то и не открылся :("); return 0; //не открылся, ну и фиг с ним, выходим из функции }
//Терь придумаем небольшую процедурку для поиска текста ;) char* pszBuffer = new char[uTextLength]; memset (pszBuffer, 0, uTextLength); DWORD dwBytesRead = 0; DWORD dwOffset = 0; unsigned int uCount = 0; while (dwOffset + uTextLength <= GetFileSize (hFile, NULL)) { SetFilePointer (hFile, dwOffset, NULL, FILE_BEGIN); if (ReadFile (hFile, pszBuffer, uTextLength, &dwBytesRead, NULL)) { if (!bCaseSens) { if (!memcmp (&pszBuffer[0], &lpTextToFind[0], uTextLength)) if (!bContinueSearch) { FunctionToCall (hFile, dwOffset, uTextLength); return 1; } else { FunctionToCall (hFile, dwOffset, uTextLength); uCount++; } } else if (!memicmp (&pszBuffer[0], &lpTextToFind[0], uTextLength)) { if (!bContinueSearch) { FunctionToCall (hFile, dwOffset, uTextLength); return 1; } else { FunctionToCall (hFile, dwOffset, uTextLength); uCount++; } } } dwOffset++; }
delete [] pszBuffer ; CloseHandle (hFile); //закрываем наш файлик ;)
return uCount; //Возвращаем количество найденного %) }
void Funcs (HANDLE hFile, DWORD dwOffset, DWORD dwSize) { static char* pszTest = new char [dwSize]; memset (pszTest, 64, dwSize); DWORD dwBytesWritten; SetFilePointer (hFile, dwOffset, NULL, FILE_BEGIN); WriteFile (hFile, pszTest, dwSize, &dwBytesWritten, NULL); delete [] pszTest }
void CMFcDlg::OnBnClickedButton1() { SearchText ("c:\\123.TxT", "Lord_Baa", true, 0, Funcs); } |