Ali Опубликовано 24 октября, 2004 Жалоба Поделиться Опубликовано 24 октября, 2004 Привет всем мне надо написать такую прогу которая бы искала заданную строку в текстовых файлах и потом выдавала результат в виде списка по которому можно было бы из своей проги перейти к нужной(найденной) позиции файла короче как это сделано в delphi Find in files. подкиньте пожалуйста каких нибудь идей на счёт этого. Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 24 октября, 2004 Жалоба Поделиться Опубликовано 24 октября, 2004 Сначало тебе надо найти всех файлов в директории procedure FindFiles; var l: integer; F: TSearchRec; begin l=0; if FindFirst('*.txt', faAnyFile, F)=0 then begin repeat inc(l) files[l]:=f.Name; until FindNext(F)<>0; end; FindClose(F); end; Тепер у тебе масив files. Тебе надо открит каждий файл из массива и проверит есть ли у него низ, которий тебе нужен. У меня нет времени написать остольное, надеюсь ето поможет тебе Желаю удачи Ссылка на комментарий Поделиться на другие сайты Поделиться
Сергей Плоткин Опубликовано 24 октября, 2004 Жалоба Поделиться Опубликовано 24 октября, 2004 Во-первых, для поиска текста в указанном файле и получения позиции строки в указанном файле, воспользуйся этой процедурой. Возвращает позицию указанной строки, или -1, если она не найдена. function ScanFile(const FileName: string; const forString: string; caseSensitive: Boolean): Longint; { returns position of string in file or -1, if not found } const BufferSize = $8001; { 32K+1 bytes } var pBuf, pEnd, pScan, pPos: PChar; filesize: LongInt; bytesRemaining: LongInt; bytesToRead: Word; F: file; SearchFor: PChar; oldMode: Word; begin Result := -1; { assume failure } if (Length(forString) = 0) or (Length(FileName) = 0) then Exit; SearchFor := nil; pBuf := nil; { open file as binary, 1 byte recordsize } AssignFile(F, FileName); oldMode := FileMode; FileMode := 0; { read-only access } Reset(F, 1); FileMode := oldMode; try { allocate memory for buffer and pchar search string } SearchFor := StrAlloc(Length(forString) + 1); StrPCopy(SearchFor, forString); if not caseSensitive then { convert to upper case } AnsiUpper(SearchFor); GetMem(pBuf, BufferSize); filesize := System.Filesize(F); bytesRemaining := filesize; pPos := nil; while bytesRemaining > 0 do begin { calc how many bytes to read this round } if bytesRemaining >= BufferSize then bytesToRead := Pred(BufferSize) else bytesToRead := bytesRemaining; { read a buffer full and zero-terminate the buffer } BlockRead(F, pBuf^, bytesToRead, bytesToRead); pEnd := @pBuf[bytesToRead]; pEnd^ := #0; { scan the buffer. Problem: buffer may contain #0 chars! So we treat it as a concatenation of zero-terminated strings. } pScan := pBuf; while pScan < pEnd do begin if not caseSensitive then { convert to upper case } AnsiUpper(pScan); pPos := StrPos(pScan, SearchFor); { search for substring } if pPos <> nil then begin { Found it! } Result := FileSize - bytesRemaining + Longint(pPos) - Longint(pBuf); Break; end; pScan := StrEnd(pScan); Inc(pScan); end; if pPos <> nil then Break; bytesRemaining := bytesRemaining - bytesToRead; if bytesRemaining > 0 then begin { no luck in this buffers load. We need to handle the case of the search string spanning two chunks of file now. We simply go back a bit in the file and read from there, thus inspecting some characters twice } Seek(F, FilePos(F) - Length(forString)); bytesRemaining := bytesRemaining + Length(forString); end; end; { While } finally CloseFile(F); if SearchFor <> nil then StrDispose(SearchFor); if pBuf <> nil then FreeMem(pBuf, BufferSize); end; end; { ScanFile } Теперь небольшая адаптация под твои запросы: 1) Если файлы, в которых тебе надо искать строку, известны и лежат в каком-либо списке или массиве, то небольшой пример таков. Пусть, есть следующие переменные: FileList : TStringList; //Список путей к файлам для поиска строки SearchStr : String; //Строка для поиска И объекты на форме: ListView1 - Список результатов. Формат отображения стоит vsReport. Две колонки - Имя файла и Позиция. Memo1 - В него будет загружаться файл и осуществляться переход на нужную позицию Поиск файлов const SearchStr='Строка для поиска';var I:Integer; FileList : TStringList; CurPos : Integer; N:TListItem;begin ListView1.Items.Clear; For I := 0 to FileList.Count-1 do begin CurPos:=ScanFile(FileList[i], SearchStr, False); If CurPos=-1 then Continue; N:=ListView1.Items.Add; N.Caption:=ExtractFileName(FileList[i]); N.SubItems.Add(IntToStr(CurPos)); end;end; Отображение. Процедура OnDoubleClick компоненты ListView1 var CurFile:String; CurPos:Integer; begin If ListView1.ItemIndex<0 then Exit; CurFile:=ListView1.Items[ListView1.ItemIndex].Caption; CurPos:=StrToInt(ListView1.Items[ListView1.ItemIndex].SubItems[0]); Memo1.Lines.LoadFromFile(CurFile); Memo1.SelStart:=CurPos; Memo1.SetFocus;end; Вроде все... Ссылка на комментарий Поделиться на другие сайты Поделиться
Ali Опубликовано 26 октября, 2004 Автор Жалоба Поделиться Опубликовано 26 октября, 2004 Спасибо за ответы. у меня ещё вопросы , моя программа должна искать строку в файлах html и выдавать результат в TWebBrowser вместо TMemo ,но в html теги тоже будут попадать в обработку и в результате отображения курсор встанет не на нужное место-как можно исключить из обработки теги? и эта процедура после первого нахождения строки остальную часть файла пропускает? и как можно прокрутить TWebBrowser вслед за установленным курсором? и как сделать чтоб курсор переходил не к позиции в строке ,а к началу самой строки. пока. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти