Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: Поиск текста в файлах
Показать сообщение отдельно

Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
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. Код взят из инета. Ссылки нема(

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:13, 23-08-2009 | #4

Название темы: Поиск текста в файлах