Доброго времени! Прошу помощи.
Есть файл, текстовый (лог-файл - ~2.5 Gb), в котором находятся строки в которых нужно выполнить поиск необходимых данных с копированием всей строки. Так вот, если файл открыть в FAR'е по F3 и запустить поиск, а также запустить прогу на поиск, всё ищется паралельно без проблем. Если запустить прогу на сервере, то выпадает ошибка I/O Error 32, причём выпадает после нажатия на кнопку поиск. Есть одно исключение, в файл постоянно пишутся данные, т.е. он "живой".
FileMode:=fmOpenRead; Reset(F); - не помогло.
Вот код.
(Button3 - открытие)
(Button4 - поиск)
(Edit1 - ввод данных для поиска)
Код:
procedure TMainForm.Button3Click(Sender: TObject);
var
sr: TSearchRec;
begin
ComboBox1.Clear;
if FindFirst(Path + '*.log', faAnyFile, sr) <> 0 //ищем файлы с расширением 'log'
then
begin
ShowMessage('Каталог не содержит log-файлов!');
exit;
end;
repeat //и наполняем их именами раскрывающийся список
t:=sr.Name;
ComboBox1.Items.Add(t);
until FindNext(sr) <> 0;
ComboBox1.ItemIndex:=0;
end;
procedure TMainForm.Button4Click(Sender: TObject);
begin
Button5.Tag:=0;
if ((ComboBox1.Text='') or not(fileexists(Path + ComboBox1.Text))) then exit;
//проверяем есть ли файл с именем из списка
AssignFile(F, Path + ComboBox1.Text); //связываем файловую переменную с именем файла
System.SetTextBuf(F, Buf); //Создаём буфер
Reset(F); //открываем файл
l:=0; //сбрасываем счетчики
c:=0;
m:=''; t:=''; //очищаем строковые переменные
Memo1.Clear; //очищаем Мемо
sign:=false; //сбрасываем признак продолжения строки
label4.Caption:=IntToStr(l);
label6.Caption:=IntToStr(c);
st := GetTickCount; //засекаем нач. время
while not eof(F) do //читаем построчно из файла, пока не дойдем до конца
begin //это и есть обработка файла
if length(t)=0 then
begin
readln(F, t); //если строковая переменная пустая, прочитали строку в строковую переменную
inc(l); //увеличили счетчик прочитанных строк
label4.Caption:=IntToStr(l);
end;
s:=AnsiUpperCase(Edit1.Text);
finded:=true;
while (finded and (length(s)>0)) do
begin
n:=pos('//', s);
if n>0 then
begin
ts:=copy(s, 1, n-1);
delete(s, 1, n+1);
end
else
begin
ts:=s;
s:='';
end;
if pos(ts, t)=0 then finded:=false;
end; //конец анализа собранной строки
if finded then
begin
t:=t+'';
Memo1.Lines.Add(t); //то добавить ее в Мемо
//Memo1.Lines.Add('');
inc(c); //увеличить счетчик найденных фрагментов
label6.Caption:=IntToStr(c);
end;
t:='';
application.ProcessMessages;
if Button5.tag<>0 then break;
et := GetTickCount; //засекаем конечное время после всего вып. цикла
end;
CloseFile(F); //закрываем файловую переменную
i:=(et-st)/1000/60;
ShowMessage('Поиск выполнен за: '+floatToStrF(i,ffFixed,2,2)+' мин.');
end;
Admin: Пользуемся тегами!
СПАСИБО.