Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
Внизкак сделать пакер ??? Найти похожие ветки
← →
Gnec © (2004-08-14 21:19) [0]Люди плиз!!! Я вот уже давно мучаюсь вопросом. как сделать пакер нескольких файлов в один???
← →
YurikGL © (2004-08-14 21:21) [1]На каком месте алгоритма затруднения?
← →
Gnec © (2004-08-14 21:30) [2]Я нашел на одном сайте статейку как это сделать, вот код
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 неизвестная переменная.
← →
Anatoly Podgoretsky © (2004-08-14 21:31) [3]Ф1 + Ф2 ...
← →
Gnec © (2004-08-14 21:34) [4]Это что??? Супер алгоритм упакофки??? А можно мне его операторами пояснить?
← →
Anatoly Podgoretsky © (2004-08-14 21:36) [5]Он поянен операторами в [2]
← →
TUser © (2004-08-14 22:16) [6]АП, какой там последний шаг-то?
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 22:20) [7]Наверно это скопировано с помощью мышки откуда ни будь из Сети.
← →
Mim1 © (2004-08-14 22:28) [8]
> откуда ни будь из Сети.
http://www.mirgames.ru/index.php?mod=article&theme=gamedev&file=gameres&print=1
← →
Gnec © (2004-08-15 12:59) [9]да, оттуда. Но скопированно правильно, из страницы.
← →
Anatoly Podgoretsky © (2004-08-15 13:03) [10]Так надо не копировать, а разбираться с кодом, на страницах Сети очень много ошибок.
← →
Gnec © (2004-08-15 15:05) [11]Я уже говорил что только начинаю програмировать :) поэтому иногда тоже могу пропустить ошибку.
← →
Юрий Зотов © (2004-08-15 22:05) [12]> Gnec © (14.08.04 21:19)
> как сделать пакер нескольких файлов в один???
Например, так.
В поток пишем:
1. Длину имени файла(1 байт)
2. Имя файла
3. Длину тела файла(8 байт)
4. Тело файла
и так - все файлы подряд, все в один поток. Потом пакуем этот поток, например, с помощью модуля ZLib (есть в Delphi).
Вот и все. Распаковаем в обратном порядке.
← →
GuAV © (2004-08-16 01:18) [13]
> Распаковаем в обратном порядке.
Имхо, вводите новичков в заблуждение - порядок пунктов тот же ;-)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.031 c