![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как сделать пакер ??? [D7, WinME, WinXP]
Gnec © (2004-08-14 21:19:00)Люди плиз!!! Я вот уже давно мучаюсь вопросом. как сделать пакер нескольких файлов в один???
GuAV (2004-08-16 01:18:00) [1]
> Распаковаем в обратном порядке.
Имхо, вводите новичков в заблуждение - порядок пунктов тот же ;-)
Юрий Зотов (2004-08-15 22:05:00) [2]> Gnec © (14.08.04 21:19)
> как сделать пакер нескольких файлов в один???
Например, так.
В поток пишем:
1. Длину имени файла(1 байт)
2. Имя файла
3. Длину тела файла(8 байт)
4. Тело файла
и так - все файлы подряд, все в один поток. Потом пакуем этот поток, например, с помощью модуля ZLib (есть в Delphi).
Вот и все. Распаковаем в обратном порядке.
Gnec (2004-08-15 15:05:00) [3]Я уже говорил что только начинаю програмировать :) поэтому иногда тоже могу пропустить ошибку.
Anatoly Podgoretsky (2004-08-15 13:03:00) [4]Так надо не копировать, а разбираться с кодом, на страницах Сети очень много ошибок.
Gnec (2004-08-15 12:59:00) [5]да, оттуда. Но скопированно правильно, из страницы.
Mim1 (2004-08-14 22:28:00) [6]
> откуда ни будь из Сети.
http://www.mirgames.ru/index.php?mod=article&theme=gamedev&file=gameres&print=1
Anatoly Podgoretsky (2004-08-14 22:20:00) [7]Наверно это скопировано с помощью мышки откуда ни будь из Сети.
TUser (2004-08-14 22:16:00) [8]АП, какой там последний шаг-то?
I:=5; // Присваиваем значение 5 переменной I
Так? Кто-то пользуется рекомендациями из той ветки :)
По сабжу - сильно подозреваю, что вот здесь begin пропущен
for i:=0 to flb.Count-1 do
f.Write(files[i],sizeof(files[i]));
f.Position:=tmp;
f.Write(offset2char,sizeof(offset2char));
f.Free;
end;
Anatoly Podgoretsky (2004-08-14 21:36:00) [9]Он поянен операторами в [2]
Gnec (2004-08-14 21:34:00) [10]Это что??? Супер алгоритм упакофки??? А можно мне его операторами пояснить?
Anatoly Podgoretsky (2004-08-14 21:31:00) [11]Ф1 + Ф2 ...
Gnec (2004-08-14 21:30:00) [12]Я нашел на одном сайте статейку как это сделать, вот код
procedure TForm1.PakClick(Sender: TObject);
var F,f2:Tfilestream; //Файловые потоки, один для файла архива, другой - для остальных файлов (все равно мы их по-очереди паковать будем)
count,i:integer; //В первую переменную мы запишем количество файлов, вторая нужна для организации цикла
head:string[3]; //Заголовок архива (PAK)
version:byte; //Версия архиватора (чтобы можно было потом определить сможем ли мы его распаковать или нет)
offset2char,tmp:integer; //Первая переменная запоминает с какого места архива будут идти данные об архивных файлах (имя, размер и т.д.), вторая запомнит позицию в начале архива где будет храниться информация о первой переменной (подробнее см. ниже)
files:array of filere; //массив с данными о архивных файлах
begin
count:=flb.Items.Count; //Узнаем количество архивируемых файлов
f:=Tfilestream.create(edit2.Text,fmCreate); //Создаем файл с именем указанным в Edit2
head:='PAK'; //Заголовок "PAK"
version:=1; //Первая версия архиватора...
f.Write(head,sizeof(head)); //Записываем заголовок архива в созданный файл
f.Write(Version,sizeof(version)); //Записываем версию
setlength(files,count); //Расширяем массив до нужного размера (подгоняем под количество файлов)
tmp:=f.Position; //Пока мы не знаем общего размера архива и с какой позиции будут идти данные о файлах в архиве (переменная offset2char). Но мы оставим для нее свободное место, а TMP запомнит это место
f.Position:=f.Position+sizeof(offset2char); //Оставляем место для offset2char
for i:=0 to flb.Count-1 do //Организуем цикл для каждого файла в списке
begin
f2:=tfilestream.Create(flb.items[i],fmOpenRead); //Открываем файл
files[i].filename:=flb.Items[i]; //Заносим его имя в список
files[i].filesize:=f2.Size; //Заносим его размер в список
files[i].offset:=f.Position; //Заносим его позицию в архиве в список
f.CopyFrom(f2,f2.Size); //Копируем содержимое файла в архив
f2.Free; //Завершаем работу с этим файлом
end; //Завершение цикла, все файлы уже записаны, осталось только сохранить данные о них
f.write(count,sizeof(count));
for i:=0 to flb.Count-1 do
f.Write(files[i],sizeof(files[i]));
f.Position:=tmp;
f.Write(offset2char,sizeof(offset2char));
f.Free;
end;
offset2char:=f.position; //Запоминаем позицию с которой начнаются данные о файлах (ее мы сохраним в отведенном месте в начале архива)
f.write(count,sizeof(count)); //Записываем количество файлов
for i:=0 to flb.Count-1 do //Организуем цикл для каждого файла
f.Write(files[i],sizeof(files[i])); //Записываем Имя/Позицию в архиве/Размер для данного файла
//Архив почти закончен, осталось вернуться в начало архива и сохранить там offset2char
f.Position:=tmp; //Переносимся в запомненое место
f.Write(offset2char,sizeof(offset2char)); //И записываем туда переменную offset2char
f.Free; //Закрываем свеже-испеченный архив - он готов к работеend.
В выделеном куску возникает ошибка что offset2char неизвестная переменная.
YurikGL (2004-08-14 21:21:00) [13]На каком месте алгоритма затруднения?