Поиск текста в файле

Вот я понаписал небольшую процедурку для сего действа;)
Правда с коментариями облом :(( оформление портят, но тут и так все с первого взгляда понятно
Тем не менее, расскажу чего мы в функцию передаем:
тек-с:
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);
}
 
« Предыдущая статья   Следующая статья »