Главная страница
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.018 c
1-93960
OlimPer
2004-02-16 22:03
2004.02.29
ShellListView


1-93900
Cardinal
2004-02-15 14:51
2004.02.29
Как писать в шеснадцатеричный файл??


3-93761
Bless
2004-02-03 16:44
2004.02.29
Назавершенная транзакция в прерванной хп.


6-94061
alexEagle
2003-12-24 14:23
2004.02.29
Почему Socket.Close прибивает данные по Socket.Data


14-94102
VAleksey
2004-02-09 16:32
2004.02.29
Запреты.