Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TStream


Страницы:   1 2 3 4

pathfinder ©   (2007-10-18 20:34:00) 

Добрый вечер.
Подскажите пожалуйста, каким образом лучше сохранить данные из TMemoryStream в файл? Но не все содержимое, а только конец определенного размера.
У меня получилось что-то такое:

 FData: TMemoryStream;
 FLimit: Integer;
 Stream: TFileStream;
 StartPos: PByte;

 StartPos := FData.Memory;
 Inc(StartPos, FData.Size - FLimit);
 Stream := TFileStream.Create(FileName, fmCreate);
 Stream.WriteBuffer(StartPos^, FLimit);
 Stream.Free;


Reindeer Moss Eater   (2007-10-19 11:24:00) [41]

Так она это уже сделала когда в прошлый раз шифровала.
Нафик грузить-то?


pathfinder   (2007-10-19 11:23:00) [42]


> А зачем программе грузить лог из файла?
> Она его что, почитывает сидя в кресле, когда заняться нечем?
>
> :)


Она его дешифрует. А перед записью в файл шифрует. Вот:)


Reindeer Moss Eater   (2007-10-19 11:22:00) [43]

1. Запуск программы и загрузка лога из файла в мемористрим.

А зачем программе грузить лог из файла?
Она его что, почитывает сидя в кресле, когда заняться нечем?
:)


pathfinder   (2007-10-19 11:20:00) [44]


> Нафик вообще такой лог?


А какой лучше?


Reindeer Moss Eater   (2007-10-19 11:13:00) [45]

Нафик вообще такой лог?


pathfinder   (2007-10-19 11:01:00) [46]


> Reindeer Moss Eater ©   (19.10.07 10:49) [18]


Так придется тогда перед сохранением в файл собирать лог по кусочкам.


pathfinder   (2007-10-19 11:00:00) [47]

Я хотел сделать так:
1. Запуск программы и загрузка лога из файла в мемористрим.
2. Работа программы и запись событий лога в конец мемористрима.
3. Завершение работы программы и сохранение лога из мемористрима в файл. Здесь решение понятно.

> Count := 1024; // длина "хвоста" в байтах
> MemoryStream.Seek(Сount, soFromEnd);
> FileStream.CopyFrom(MemoryStream, Сount);

Но на случай длительной работы программы я хотел еще предусмотреть возможность контролировать размер мемористрима, чтобы он не разрастался слишком. Поэтому подумал делать проверку при записи нового события в лог. Только вот мой вариант не очень удачный, слишком медленно будет работать.


Reindeer Moss Eater   (2007-10-19 10:49:00) [48]

Ну нет уж конечно:)

Тогда в чем проблема?
тем более если не хочется колбасить весь стрим после добавления очередной строки лога?


ЮЮ   (2007-10-19 10:46:00) [49]

> а самые старые удалялись

А у тебя самое старое место - начало лога - затретcя только тогда когда лог в памяти превысит отведенное место на диске. Во всех остальных случаях (по достижении максимально размера на диске) будет затираться самые свежие данные, которые всегда будут в конце лога.

P/S/ Или у тебя сохраняемый лог всегда больше отведенного места на диске?


pathfinder   (2007-10-19 10:45:00) [50]


> У тебя люди непосредственно мемористрим читают?
> Сила!


Ну нет уж конечно:) Я его в файл сохраняю.


Reindeer Moss Eater   (2007-10-19 10:41:00) [51]

Получится не очень читабельно

У тебя люди непосредственно мемористрим читают?
Сила!


pathfinder   (2007-10-19 10:23:00) [52]


> Если текушая позиция + новая строка превысят лимит,  сместить
> указатель вначало и писать по старым записям.


Получится не очень читабельно. Хотелось чтобы последние записи были в конце и их можно было сразу найти, а самые старые удалялись.


Reindeer Moss Eater   (2007-10-19 10:05:00) [53]

Если текушая позиция + новая строка превысят лимит,  сместить указатель вначало и писать по старым записям.


pathfinder   (2007-10-19 10:02:00) [54]


> изначально не писать в этот стрим ничего кроме "нужного
> хвоста".


В стрим пишется лог. Мысль в том, чтобы при записи смотреть не превышает ли размер данных лимит и если превышает, то оставлять только "хвост" от данных в размере лимита.


Reindeer Moss Eater   (2007-10-19 09:56:00) [55]

Как бы сделать это более оптимально?

изначально не писать в этот стрим ничего кроме "нужного хвоста".


pathfinder   (2007-10-19 09:54:00) [56]


> А как лучше обрезать содержимое потока, так чтобы взять
> тоже его "хвост" определенной длины?


Точней оставить только "хвост" определенного размера, а все что до этого удалить.


pathfinder   (2007-10-19 09:53:00) [57]

Добрый день!
А как лучше обрезать содержимое потока, так чтобы взять тоже его "хвост" определенной длины?
Пришло в голову только это:

procedure TLog.DecreaseData;
var
 Stream: TMemoryStream;
begin
 if FData.Size > FLogSizeLimit then begin
   FData.Seek(-FLogSizeLimit, soFromEnd);
   Stream := TMemoryStream.Create;
   Stream.CopyFrom(FData, FLogSizeLimit);
   FData.LoadFromStream(Stream);
   Stream.Free;
 end
end;

Как бы сделать это более оптимально?


pathfinder   (2007-10-18 22:39:00) [58]


> Anatoly Podgoretsky ©   (18.10.07 22:35) [7]


Мда..как всегда меня подвела невнимательность.

Спасибо!


Anatoly Podgoretsky   (2007-10-18 22:35:00) [59]

soFromEnd Offset is from the end of Memory. Offset must be <= 0 to indicate a number of bytes before the end of the memory buffer.


pathfinder   (2007-10-18 22:31:00) [60]

Причем если  Stream.CopyFrom(FData, 0); то ошибки нет..


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо