Код:
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);
}
lpFilename - это имя файлика, в котором искать бум.
lpTextToFind - текст поиска.
bool bCaseSend - поиск с учетом регистра букв или без онного...
bool bContinueSearch - будет ли наш поиск продолжен после того, как нашли одно слово
void FunctionToCall(HANDLE hFile, DWORD dwOffset, DWORD dwSize) - будит вызвана если текст найден.
в неё передадим дескриптор файла(hFile), смещение от начала файла до начала слова(dwOffset), и длина слова(dwSize)
P.S. Код взят из инета. Ссылки нема(