|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Ошибка I/O Error 32
Доброго времени! Прошу помощи.
Есть файл, текстовый (лог-файл - ~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, 08.04.2009 в 10:38. |
#2
|
||||
|
||||
Скорее всего программа которая пишет лог блокирует файл.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
Ошибка I/O Error 32
Да, но если на сервере я его открываю FAR'ом по F3 и запускаю поиск, то он ищет. Т.е. я так понимаю блокировки, по крайне мере на чтение, нет. FAR может открыть на чтение, а програмулька нет, или у FAR'а какой-то свой способ открытия файла..
|
#4
|
||||
|
||||
Просто фар грамотно работает с занятыми файлами. Почитайте вот эту статейку, многое прояснится.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
Спасибо! В общих чертах понятно, правда пока сложновато, бум грызть. Если бы кто-нить привёл пример (в общих чертах), как это реализовать, было бы вообще шикарно.
|