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

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

как сделать пакер ??? [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]

На каком месте алгоритма затруднения?


Наверх

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