Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1092653551
Gemini
2004-08-16 14:52
2004.08.29
Переменные в Run-Time


3-1091605000
Oksana
2004-08-04 11:36
2004.08.29
Сохранение результата запроса в Recordset


4-1089823106
webpauk
2004-07-14 20:38
2004.08.29
WM_MENUSELECT


1-1092327123
xman
2004-08-12 20:12
2004.08.29
STRING в CHAR


3-1091512145
serg128
2004-08-03 09:49
2004.08.29
Сортировка в TClientDataSet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский