Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.04.2009, 09:57
navigator navigator вне форума
Прохожий
 
Регистрация: 08.04.2009
Сообщения: 6
Репутация: 10
Печаль Ошибка 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: Пользуемся тегами!

СПАСИБО.

Последний раз редактировалось Admin, 08.04.2009 в 10:38.
Ответить с цитированием
  #2  
Старый 08.04.2009, 10:09
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Скорее всего программа которая пишет лог блокирует файл.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 08.04.2009, 10:46
navigator navigator вне форума
Прохожий
 
Регистрация: 08.04.2009
Сообщения: 6
Репутация: 10
По умолчанию Ошибка I/O Error 32

Да, но если на сервере я его открываю FAR'ом по F3 и запускаю поиск, то он ищет. Т.е. я так понимаю блокировки, по крайне мере на чтение, нет. FAR может открыть на чтение, а програмулька нет, или у FAR'а какой-то свой способ открытия файла..
Ответить с цитированием
  #4  
Старый 08.04.2009, 11:13
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Просто фар грамотно работает с занятыми файлами. Почитайте вот эту статейку, многое прояснится.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 08.04.2009, 11:54
navigator navigator вне форума
Прохожий
 
Регистрация: 08.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

Спасибо! В общих чертах понятно, правда пока сложновато, бум грызть. Если бы кто-нить привёл пример (в общих чертах), как это реализовать, было бы вообще шикарно.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:56.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter