Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2008, 09:53   #1
ryton
Пользователь
 
Аватар для ryton
 
Регистрация: 23.05.2008
Сообщений: 97
Печаль FileStream

Часть кода, на строчке Reader.ReadListBegin; выкидывает ошибку Invalid property value.Посмотрел примеры,вроде все правильно,да и как то работать с этим тока сейчас пришлось,может кто что подскажет...
FileStream:= TFileStream.Create('E:\WorkRyton\Ло ги\radius-2008.4.26-3_26_22.log',
fmOpenRead);
Reader := TReader.Create(FileStream, 2048);
Reader.ReadListBegin;
s:=Reader.ReadStr;
я не для этого мира и это так
ryton вне форума Ответить с цитированием
Старый 26.05.2008, 10:52   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
If the next item in the stream is not a start-of list marker as written by the WriteListBegin method, ReadListBegin raises an EReadError exception.
Посмотрите порядок записи. Вызван ли WriteListBegin после создания потока на запись ?
alexBlack вне форума Ответить с цитированием
Старый 26.05.2008, 11:06   #3
ryton
Пользователь
 
Аватар для ryton
 
Регистрация: 23.05.2008
Сообщений: 97
По умолчанию

Мне из файла только читать надо....А писать в него вообще нельзя,ну всмысле нежелательно.
я не для этого мира и это так
ryton вне форума Ответить с цитированием
Старый 26.05.2008, 11:09   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от ryton Посмотреть сообщение
Мне из файла только читать надо....А писать в него вообще нельзя,ну всмысле нежелательно.
Но кто-то же в него записал. Значит первым элементом записан не маркер списка. Об этом Вам и сообщается в ошибке - неверное значение свойства.

Прикрепите пример файла и объясните, что из него Вы хотите считать.
alexBlack вне форума Ответить с цитированием
Старый 26.05.2008, 11:13   #5
ryton
Пользователь
 
Аватар для ryton
 
Регистрация: 23.05.2008
Сообщений: 97
По умолчанию

Файл лога сервера.размер его от 50 метров до 3 гигов,пишет в него естественно сервак,а мне надо программно его анализировать.Если открывать Reset то не получается,хотя Lister открывает.
я не для этого мира и это так
ryton вне форума Ответить с цитированием
Старый 26.05.2008, 11:29   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

То есть это текстовый файл ?
Тогда Вы зря используете TReader. Для него данные должны быть подготовлены TWriter'ом.

Попробуйте по-другому. Например, с использованием TParser:
Код:
var F:TFileStream;
    P:TParser;
    S:String;
begin
   F := TFileStream.Create('uMain.pas', fmOpenRead);
   try
      P := TParser.Create(F);
      try
         repeat
            S := P.TokenString;
            
         until P.NextToken = toEOF
      finally
         P.free;
      end;
   finally
      F.free;
   end
Но, по моему, этот вариант даже для 50М будет слишком долгим.
Проще используя TFileStream переместиться ближе к концу файла (если, конечно, не нужно анализировать весь log), затем читать в буфер (FileStream.Buffer) и уже из буфера выбирать строки - поиск разделителей строк #13#10.
alexBlack вне форума Ответить с цитированием
Старый 26.05.2008, 11:33   #7
ryton
Пользователь
 
Аватар для ryton
 
Регистрация: 23.05.2008
Сообщений: 97
По умолчанию

в этом и самая проблема,что искать нужно по всему логу.Если брать из архива,то и с помощью Reset можно работать нормально,но тоже долго.Пасибо за совет,сейчас попробую
я не для этого мира и это так
ryton вне форума Ответить с цитированием
Старый 26.05.2008, 12:17   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

ryton, открывайте его лучше через CreateFile.
B_N вне форума Ответить с цитированием
Старый 26.05.2008, 12:48   #9
ryton
Пользователь
 
Аватар для ryton
 
Регистрация: 23.05.2008
Сообщений: 97
По умолчанию

я просто в этом не сильно разбираюсь,а TokenString берет не всю строку,а по частям.
я не для этого мира и это так
ryton вне форума Ответить с цитированием
Старый 26.05.2008, 13:53   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от ryton Посмотреть сообщение
я просто в этом не сильно разбираюсь,а TokenString берет не всю строку,а по частям.
Ну, Вы же все равно потом будете разбирать строки.
А полными строками можно читать, например, так:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var buffer : array [word] of char;
    C, LP : integer;
    LS : string;
    F:TFileStream;

 function nextString:String;
 var S1:String;
     P:integer;
 begin
    if C = 0 then begin
       C := sizeOf(Buffer);
       C := F.read(buffer, C);
       if C = 0 then begin
          if LS = '' then result := #27 else result := LS;
          exit;
       end;
       LP := 0;
    end;

    P := LP;
    while (P < C) do begin
       if Buffer[P] = #10 then LP := P+1
       else if Buffer[P] = #13 then break;
       inc(P);
    end;

    if P-LP = 0
    then S1 := ''
    else begin
       setString(S1, PChar(@Buffer[LP]), P-LP);
    end;
    LS := LS + S1;

    if Buffer[P] = #13 then begin
       result := LS;
       LS := '';
       inc(P); LP := P;
    end else begin
       if P >= C then C := 0;
       result := nextString
    end;
 end;

var S:String;
begin
   Memo1.Lines.Clear;
   F := TFileStream.Create('d:\system.pas', fmOpenRead);
   try
      C := 0; LS := '';
      while true do begin
         S := nextString;
         if S = #27 then break;
         memo1.lines.add(S);
      end;
   finally
       F.free;
   end;
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц