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

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

KolZLib


Евгений ©   (2003-06-06 10:23:00) 

Как используя KolZLib распаковать файл, находящийся в ресурсе, но при этом не сохранить его на диск, а создать новый PStream?


Centronix   (2003-06-08 13:39:00) [1]


> Как использовать ZLibEvent для отображения процедуры упаковки?

В теории он вызывается периодически в процессе сжатия данных (когда буффер заполняется в очередной раз). А для обновления прогрессбара надо знать сколько байт вы хотите в него записать (например свойство Size исходного потока) и сколько вы в него уже записали (свойство Position потока созданного процедурой NewCompressionStream).


Юрец   (2003-06-07 16:29:00) [2]

Рас уж заговорили о KOLZLib, тогда такой вопрос:
Как использовать ZLibEvent для отображения процедуры упаковки?
И еще если можно какой нибудь бы алгоритм (по быстрее) упаковки и распаковки нескольких файлов при помощи ZLib и др.
Заранее пасиба.


Евгений   (2003-06-06 22:11:00) [3]

Благодарю...


Кладов   (2003-06-06 20:40:00) [4]

Position := 0;- до того, как читать из потока сразу после записи в него Stream2Stream, Resource2Stream, ...
Тяжелая была неделя, наверное, надо отдохнуть :)


Евгений   (2003-06-06 19:11:00) [5]

Пробовал уже и так:
PackStream := NewMemoryStream;
Resource2Stream(PackStream,HInstance,"DATA",RT_RCDATA);
PackStream.Position := 0;
try
EndStream := NewDecompressionStream(PackStream,nil);
finally
PackStream.Free;
end;


Всё равно не работает... Но ладно, помогите пока разобраться с этой проблемой:

ugp.dat (697573) - предварительно упакованный файл ugp_u.dat (712012)

Вариант 1:

PackStream := NewReadFileStream("ugp.dat");
try
WriteStream := NewWriteFileStream("ugp_u.dat");
try
PackStream.Read(Size,4);
EndStream := NewDecompressionStream(PackStream,nil);
CopyFrom(EndStream,WriteStream,Size);
PackStream.Free;
EndStream.Read(Size,4);
finally
EndStream.Free;
end;
finally
WriteStream.Free;
end;


Всё отлично работает, на выходе получаем распакованный файл ugp_u.dat (712012).

Вариант 2:

PackStream := NewMemoryStream;
Resource2Stream(PackStream,HInstance,"DATA",RT_RCDATA);
try
WriteStream := NewWriteFileStream("ugp_u.dat");
try
PackStream.Read(Size,4);
EndStream := NewDecompressionStream(PackStream,nil);
CopyFrom(EndStream,WriteStream,Size);
PackStream.Free;
EndStream.Read(Size,4);
finally
EndStream.Free;
end;
finally
WriteStream.Free;
( ?) [6]

Пробовал уже и так:
PackStream := NewMemoryStream;
Resource2Stream(PackStream,HInstance,"DATA",RT_RCDATA);
PackStream.Position := 0;
try
EndStream := NewDecompressionStream(PackStream,nil);
finally
PackStream.Free;
end;


Всё равно не работает... Но ладно, помогите пока разобраться с этой проблемой:

ugp.dat (697573) - предварительно упакованный файл ugp_u.dat (712012)

Вариант 1:

PackStream := NewReadFileStream("ugp.dat");
try
WriteStream := NewWriteFileStream("ugp_u.dat");
try
PackStream.Read(Size,4);
EndStream := NewDecompressionStream(PackStream,nil);
CopyFrom(EndStream,WriteStream,Size);
PackStream.Free;
EndStream.Read(Size,4);
finally
EndStream.Free;
end;
finally
WriteStream.Free;
end;


Всё отлично работает, на выходе получаем распакованный файл ugp_u.dat (712012).

Вариант 2:

PackStream := NewMemoryStream;
Resource2Stream(PackStream,HInstance,"DATA",RT_RCDATA);
try
WriteStream := NewWriteFileStream("ugp_u.dat");
try
PackStream.Read(Size,4);
EndStream := NewDecompressionStream(PackStream,nil);
CopyFrom(EndStream,WriteStream,Size);
PackStream.Free;
EndStream.Read(Size,4);
finally
EndStream.Free;
end;
finally
WriteStream.Free;
end;


На выходе получаем файл ugp_u.dat размером 1243744 (?), состоящий из 00.

Ссылка на ресурс верная! (Точно! Проверено. Но если указывать любую другую получим тот же результат).
И ещё. И в первом, и во втором варианте (и в любом другом при декомпрессии), EndStream.Size возвращает -1. И вообще, с этим потоком нельзя работать, можно только скопировать в другой (WriteFileStream), и работать потом с другим (если скопировать в MemoryStream, использовать его невозможно).

Обьясните, пожалуйста.


Кладов   (2003-06-06 17:55:00) [6]

Ну PackStream тоже до того как начинать его читать, надо в позицию 0 поставить. В примере я не вижу, чтобы это было сделано. Естественно, EndStream в итоге пустой.


Евгений   (2003-06-06 16:55:00) [7]

Пробовал и Position := 0, не получается, в смысле делал проверку как раз по EndSteam.Size, получаю значение -1.


Кладов   (2003-06-06 15:59:00) [8]

В смысле не получается? А что вы с ним делаете? Может надо Position := 0;сделать, чтобы можно было теперь из него читать. И вообще, что дает ShowMessage( Int2Str( EndStream.Size ) );?


Евгений   (2003-06-06 13:12:00) [9]

Я пробую так:
PackStream := NewMemoryStream;
Resource2Stream(PackStream,HInstance,"DATA",RT_RCDATA);
try
( PackStream,nil) [2]

Я пробую так:
PackStream := NewMemoryStream;
Resource2Stream(PackStream,HInstance,"DATA",RT_RCDATA);
try
EndStream := NewDecompressionStream(PackStream,nil);
finally
PackStream.Free;
end;
Но в результате ничег с EndStream не получается


Кладов   (2003-06-06 11:52:00) [10]

См. пример в KOLPNG.


Наверх

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