Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение нескольких файлов в одном 
:(
    Опции темы
MetalFan
Дата 17.8.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(AntonN @  17.8.2009,  00:28 Найти цитируемый пост)
лучше считать что не двигает и делать все самому smile 

смотря что подразумевается под "делать все самому"...
если имеется ввиду неиспользование CopyFrom, то здесь я тоже не согласен.
ХОТЯ есть некоторые моменты, когда CopyFrom не подходит...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
kami
Дата 17.8.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(AntonN @  17.8.2009,  10:41 Найти цитируемый пост)
Почему. лучше. ?

smile
CopyFrom передвинет сам указатель на нужное количество байт.
В этом случае манипуляции с Seek (или оберткой над ним - Position) - потенциальный глюкодром, причем достаточно неявный.
Цитата(MetalFan @  17.8.2009,  14:42 Найти цитируемый пост)
ХОТЯ есть некоторые моменты, когда CopyFrom не подходит...

Можно пример "навскидку"? Просто я всегда, когда нужно перекинуть данные из одного TStream в другой, пользуюсь CopyFrom (а его второй параметр :=0 - это вообще песня smile ). Только в данном случае, если размер исходного файла =0, то при распаковке это приведет к багу - все последующие файлы ошибочно запишутся в этот. Но это контролируемая штука, один if - и всё в порядке.
PM MAIL WWW   Вверх
AntonN
Дата 17.8.2009, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



Цитата

В этом случае манипуляции с Seek (или оберткой над ним - Position) - потенциальный глюкодром, причем достаточно неявный.

Вот когда ты вручную указываешь позицию куда писать - ты можешь точно видеть в коде откуда он пишет.
А когда надеешься на невидимый указатель который "вроде бы должен быть тут" - вот это уже потенциальный глюкодром smile


MetalFan
Цитата

смотря что подразумевается под "делать все самому"...

подразумевается "выполнять position:=" когда точно нужно быть увереным в какую позицию должен установиться указатель.

Добавлено через 7 минут и 5 секунд
дополню на всякий случай, что опыта на стримах съел прилично, старый кусочек его вывалился в первых постах (который за час обрастает нужными полями в хедере (название файла, атрибуты и тп), прикручивается zlib и если надо шифрование).
Никакого глюкодрома за годА плотного щупанья TFileStream.position я не встречал, зато часто натыкался на свои же грабли когда указатель после Write был не там, где должен быть перед очередной операцией (в основном связано было с модификацией кода, когда подзабывалась структура файла).


--------------------
user posted image
PM MAIL WWW   Вверх
kami
Дата 17.8.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(AntonN @  17.8.2009,  18:12 Найти цитируемый пост)
Вот когда ты вручную указываешь позицию куда писать - ты можешь точно видеть в коде откуда он пишет.

В контексте данной задачи это (на мой взгляд) будет выглядеть примерно так:

1. установить указатель в 0.
Loop:
  2. считать длину файла (и при необходимости - имя, атрибуты и т.д.)
  3. запомнить позицию указателя
  4. считать файл из потока
  5. установить указатель на "запомненный"+длина файла
goto Loop (пока не достигнем конца потока).

Если доводить до абсурда - то каждая четная операция(2,4) тоже должна обрамляться запоминанием предыдущего положения указателя и ручным передвиганием его дальше.
Извините, но... "это не наш метод".

Цитата(AntonN @  17.8.2009,  18:12 Найти цитируемый пост)
о опыта на стримах съел прилично,

Большинство из посетителей форума могут сказать то же самое.
Цитата(AntonN @  17.8.2009,  18:12 Найти цитируемый пост)
Никакого глюкодрома за годА плотного щупанья TFileStream.position я не встречал, зато часто натыкался на свои же грабли когда указатель после Write был не там, где должен быть перед очередной операцией

... не будем начинать холивар, тем более что к теме он относится слабо smile

Добавлено через 1 минуту и 36 секунд
Цитата(AntonN @  17.8.2009,  18:12 Найти цитируемый пост)
когда надеешься на невидимый указатель который "вроде бы должен быть тут"

А именно поэтому Read и Write методы TStream - это функции. Возвращающие реальное количество считанного/записанного.
PM MAIL WWW   Вверх
MetalFan
Дата 17.8.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(AntonN @  17.8.2009,  00:28 Найти цитируемый пост)
лучше считать что не двигает и делать все самому smile


Цитата(kami @  17.8.2009,  07:32 Найти цитируемый пост)
Лучше. так. не. считать.

ребят, ну не устраивайте тут считалки. Ctrl+Click еще никто не отменял. а код CopyFrom не так уж и сложен для понимания. и сразу отпадут все вопросы, при каких входных данных этот злобный CopyFrom какие выходные данные оставит)
если кому что-то непонятно, могу здесь код CopyFrom прокомментировать.
Цитата(kami @  17.8.2009,  17:08 Найти цитируемый пост)
Можно пример "навскидку"?

да на здоровье)
единственной проблемой, с которой я столкнулся при использовании метода TStream.CopyFrom, и из-за которой от него пришлось отказаться, это была проблема, связанная с использованием ZLib.TCompressStream, ZLib.TDecompressStream...
в частности при распаковке потока следующим кодом:
Код

var
  lCompressedStream, lDecompressedStream: TStream;
  lDecompressStream: TDecompressStream;
begin
...
//где-то в коде получаем сжатые данные в lComressedStream и нам надо его распаковать в lDecompressStream
...
  lDecompressStream := TDescompressStream.Create(lCompressedStream);
  try
    lDecompressedStream.CopyFrom(lDecompressStream, 0); //тут ловим EDecompressionError
  finally
    lDecompressStream.Free;
  end;

ибо TDecompressionStream не умеет делать Seek(0, soFromEnd)... 
т.е. мы не узнаем размер распакованных данных, не распаковав их, или не сохранив из предварительно в том же потоке(к примеру).
тогда вместо CopyFrom пришлось использовать нечто такое:
Код

var
  lBuff: array [0..1023] of byte;
  lReaded: integer;
  lSrcStrm, lDstStrm: TStream;
  lDecompStrm: TDecompressionStream;
begin
...
  lDecompStrm := TDecompressionStream.Create( lSrcStrm );
  try
    repeat
      lReaded := lDecompStrm.Read(lBuff, 1024 );
      lDstStrm.Write( lBuff, lReaded);
    until lReaded > 0;
  finally
    lDecompStrm.Free;
  end;

ну вот как-то так...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
kami
Дата 17.8.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(MetalFan @  17.8.2009,  21:10 Найти цитируемый пост)
ибо TDecompressionStream не умеет делать Seek(0, soFromEnd)... 

Ага, точно, есть такое. Одна из причин, из-за которых и перешел на FastZLib.
PM MAIL WWW   Вверх
MetalFan
Дата 18.8.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(kami @  17.8.2009,  21:27 Найти цитируемый пост)
Одна из причин, из-за которых и перешел на FastZLib. 

а какие еще были причины? хотя это наверное уже злостный оффтоп будет)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Yanis
Дата 18.8.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(MetalFan @  18.8.2009,  12:25 Найти цитируемый пост)
хотя это наверное уже злостный оффтоп будет) 

Он уже был smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1281 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.