Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Вниз

TStream   Найти похожие ветки 

 
pathfinder   (2007-10-18 20:34) [0]

Добрый вечер.
Подскажите пожалуйста, каким образом лучше сохранить данные из 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;


 
Jump   (2007-10-18 21:22) [1]

Передвинь указатель к нужной тебе позиции, и скопируй:

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


 
pathfinder   (2007-10-18 21:25) [2]


> Jump   (18.10.07 21:22) [1]


Спасибо!


 
pathfinder   (2007-10-18 22:16) [3]

Почему-то у меня с аналогичным кодом компилятор выдает ошибку Stream Read Error.


 
Anatoly Podgoretsky ©   (2007-10-18 22:19) [4]

Точное сообщение компилятора, с номером строки.


 
pathfinder   (2007-10-18 22:28) [5]

"Project ... raised exception class EReadError with message "Stream read error" "

возникает на строке Stream.CopyFrom(FData, FLimit);

 FData.Seek(FLimit, soFromEnd);
 Stream := TFileStream.Create(FileName, fmCreate);
 Stream.CopyFrom(FData, FLimit);
 Stream.Free;

И я не совсем понял почему в методе Seek к размеру потока прибавляется смещение в случае сдвига от конца..

function TCustomMemoryStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
 case Origin of
   soFromBeginning: FPosition := Offset;
   soFromCurrent: Inc(FPosition, Offset);
   soFromEnd: FPosition := FSize + Offset;
 end;
 Result := FPosition;
end;


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

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


 
Anatoly Podgoretsky ©   (2007-10-18 22:35) [7]

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:39) [8]


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


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

Спасибо!


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

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

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-19 09:54) [10]


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


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


 
Reindeer Moss Eater ©   (2007-10-19 09:56) [11]

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

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


 
pathfinder   (2007-10-19 10:02) [12]


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


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


 
Reindeer Moss Eater ©   (2007-10-19 10:05) [13]

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


 
pathfinder   (2007-10-19 10:23) [14]


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


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


 
Reindeer Moss Eater ©   (2007-10-19 10:41) [15]

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

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


 
pathfinder   (2007-10-19 10:45) [16]


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


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


 
ЮЮ ©   (2007-10-19 10:46) [17]

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

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

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


 
Reindeer Moss Eater ©   (2007-10-19 10:49) [18]

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

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


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

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

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

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


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


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


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


 
Reindeer Moss Eater ©   (2007-10-19 11:13) [21]

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


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


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


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


 
Reindeer Moss Eater ©   (2007-10-19 11:22) [23]

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

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


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


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


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


 
Reindeer Moss Eater ©   (2007-10-19 11:24) [25]

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


 
pathfinder   (2007-10-19 11:26) [26]


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


Простите, не понял.


 
Reindeer Moss Eater ©   (2007-10-19 11:29) [27]

Есть файл лога, который бы зашифрован ранее.
Нафига программе грузить этот файл лога.
Зачем он ей?


 
pathfinder   (2007-10-19 11:29) [28]


> Нафик грузить-то?


Если вы имеете в виду, что лучше писать в другой файл, то хотелось бы их плодить.


 
Reindeer Moss Eater ©   (2007-10-19 11:30) [29]

Чувак, проснись!
Зачем программе старый лог?
Можешь ответить?


 
pathfinder   (2007-10-19 11:35) [30]


> Есть файл лога, который бы зашифрован ранее.
> Нафига программе грузить этот файл лога.
> Зачем он ей?
>


Чтобы дописать в него новые данные.
Программа шифрует/дешифрует все содержимое мемористрима xor-ом с ключом.
Если шифровать каждую строку и потом записывать, то как потом дешифровать файл? Как найти где конец каждой строки?


 
Reindeer Moss Eater ©   (2007-10-19 11:37) [31]

сняли задачу аварийно. лога нет.
зачем такой лог?


 
pathfinder   (2007-10-19 11:38) [32]


> сняли задачу аварийно. лога нет.
> зачем такой лог?


А какие варианты?


 
Reindeer Moss Eater ©   (2007-10-19 11:41) [33]

варианты есть, но они расчитаны на неизвращенное представление о логах.
тебе они не подойдут.


 
korneley ©   (2007-10-19 11:44) [34]


> Программа шифрует/дешифрует все содержимое мемористрима
> xor-ом с ключом
Ничего не понял... :( зачем "шифровать"  лог, да еще таким "уникальным" способом? Дабы непуганного пользователя в заблужбение ввести?


 
pathfinder   (2007-10-19 12:02) [35]


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


Ну примерно так.


 
pathfinder   (2007-10-19 12:25) [36]

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


 
Reindeer Moss Eater ©   (2007-10-19 12:28) [37]

шифровать потом кодировать в текст


 
Reindeer Moss Eater ©   (2007-10-19 12:32) [38]

либо шифровать цезарем


 
pathfinder   (2007-10-19 12:48) [39]


> шифровать потом кодировать в текст


Это как?


> либо шифровать цезарем


Ну это уж слишком просто. Так не интересно:)


 
pathfinder   (2007-10-19 14:01) [40]

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



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.035 c
2-1192793681
Neo
2007-10-19 15:34
2007.11.11
как вывести результат поиска по базе в Edit


1-1187850968
elserpiente
2007-08-23 10:36
2007.11.11
как прочитать version information


15-1191242767
REA
2007-10-01 16:46
2007.11.11
Прорисовка компонента Explorer Search bar


2-1192729777
periskops
2007-10-18 21:49
2007.11.11
Определение прав пользователя


15-1191917876
031178
2007-10-09 12:17
2007.11.11
Компоненты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский