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

Вниз

как сделать пакер ???   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
6-1088324258
Scordion
2004-06-27 12:17
2004.08.29
Компонент для скачивания файлов!


4-1090235844
Geoji
2004-07-19 15:17
2004.08.29
Оповещатель


4-1090223134
DmitryMN
2004-07-19 11:45
2004.08.29
Поиск директории Program Files


14-1092303585
SiJack
2004-08-12 13:39
2004.08.29
Незаметили что доллар как то расти начал?


4-1089842903
DeScriptor
2004-07-15 02:08
2004.08.29
Выбор директории