Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.29;
Скачать: CL | DM;

Вниз

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

 
Евгений   (2003-06-06 10:23) [0]

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


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

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


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

Я пробую так:
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 15:59) [3]

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


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

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


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

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


 
Евгений   (2003-06-06 19:11) [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;
( ?) [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 20:40) [7]

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


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

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


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

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


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


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

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



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

Текущий архив: 2004.02.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
7-94214
NetKnight
2003-12-07 17:25
2004.02.29
Програмный Log off в Windows XP


14-94148
Knight
2004-02-04 23:41
2004.02.29
Есть ли место 486-му в современной локалке?


1-93841
akiro
2004-02-16 16:29
2004.02.29
Проблемы с SetWindowPlacement


4-94231
DillerXX
2003-12-22 17:16
2004.02.29
Перезагрузка+БАТ


14-94112
Vuk
2004-02-09 16:48
2004.02.29
Нашел интересный сервис в сети.