Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2013, 17:33   #1
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
Лампочка Проблемы при создании архиватора

Доброго времени суток! Вот пытаюсь создать свой упаковщик файлов и столкнулся с определенными сложностями...
Вопрос таков: как можно организовать разделение архива на тома? т. е. как вообще организовать томную структуру архива, чтобы распаковщику было удобно его читать? Может кто уже проходил данную тему, подскажет как правильнее будет...

Придумал пока вот что:

Объявления типов:
Код:
type
  BOOL = Byte;
  DWORD = Cardinal;
  QWORD = Int64;
1. Структура заголовка архива

а) Если первый том архива, то пишем такую структуру

Сначала размер текстового заголовка
Код:
SizeHeaderStr: Word;
Затем сам текстовый заголовок в Unicode.
Код:
const
  PACK_STRING_HEADER = '<MainHeader>';
Затем главная структура заголовок архива
Код:
TMainHeader = record
  SizeName: LongInt;         // Размер строки имени архива
  Flags: DWORD;               // Флаги архива
  Version: DWORD;            // Версия упаковщика архива
  StructPos: QWORD;         // Позиция структур навигации в файле
  StructSize: QWORD;        // Размер структур навигации
  StructCount: DWORD;      // Количество структур навигации
  CommentSize: QWORD;    // Размер комментариев
  ZipCommentSize: QWORD; // Сжатый размер комментариев
  PackParts: DWORD;          // Количество частей
  PartMaxSize: QWORD;       // Максимальный размер тома
  SizeMaskParts: Word;    // Размер строки маски имени тома архива
end;
Затем записываем внутреннее имя архива и маску имени, чтобы знать какие будут названия файлов остальных томов

б) Если другой том и т.д., то пишем такую структуру

Сначала размер текстового заголовка
Код:
SizeHeaderStr: Word;
Затем сам текстовый заголовок в Unicode.
Код:
const
  PACK_STRING_HEADER = '<MainHeaderPart>';
Затем главная структура заголовок тома архива
Код:
TMainHeaderPart = record
  SizeName: LongInt;       // Размер строки имени архива для проверки
  Version: DWORD;          // Версия упаковщика архива
  Flags: DWORD;             // Флаги архива
  NumPackPart: DWORD;   // Номер тома архива
end;
Затем записываем внутреннее имя архива

2. Структура массива данных

Сначала записываем заголовок файла:
Код:
TElementHeader = record
  ID: QWORD;             // Уникальный ID файла
  Pos: QWORD;            // Позиция начала файла в архиве
  Size: QWORD;           // Размер распакованного файла
  ZipSize: QWORD;        // Размер запакованного файла в архиве
  ParentID: QWORD;       // ID родительского каталога
  SizeName: Word;        // Размер строки имени файла или каталога
  PackNum: DWORD;      // Номер тома в котором находится начало "Pos" файла 

  // Указывает разделенный ли этот файл на части.
  // Если да, то Size в структуре навигации будет
  // указывать на полный распакованный размер файла, а ZipSize
  // будет указывать на размер упакованной части файла в текущем томе
  PackDivided: BOOL;
  ZipLevel: Byte;          // Метод сжатия файла
  Attributes: DWORD;   // Атрибуты файла или каталога
end;
Дальше записываем имя файла и сам файл в упакованном виде. Потом второй файл и так далее.

а после всего, в конец архива (1 тома) записываем все заголовки и имена файлов и папок, для навигации по архиву. Фактически дублируем все структуры заголовков файлов, отличие только в том, что здесь будет и структуры папок и некоторые параметры игнорируются если в атрибутах указано что это папка. Пишу в конец файла, так как считаю, что потом будет легче добавлять новые файлы в архив без его перепаковки...

Навигация осуществляется так: каждый файл или папка имеет уникальный ID, а так же родительский ParentID. ParentID указывает на ID папки в которой находится файл или папка.

Но вот вопрос в том как организовать разделение архива на тома с фиксированным размером? Как реализовать саму процедуру упаковки файлов в архив и разделение тут же на тома... Может у кого есть свои наработки, может идеи или мысли по этому поводу... Мне все, что угодно пригодится...

Заранее спасибо!
SalasAndriy вне форума Ответить с цитированием
Старый 28.11.2013, 18:12   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Немного отойду от темы: А сам компрессор уже есть?
Просто мне интересны принципы компресиии, изучал LZ но пока швах в практике написания такого.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.11.2013, 19:56   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для начала почитал бы например это
http://www.win-rar.ru/support/knowle...il.php?ID=1081
все таки умные люди разрабатывали. Идея записи оглавления в конец архива порочна - что делать при добавлении файлов в архив?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.11.2013, 21:15   #4
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Немного отойду от темы: А сам компрессор уже есть?
Просто мне интересны принципы компресиии, изучал LZ но пока швах в практике написания такого.
Нет, свой компрессор пока не делал. Хочу для начала разобраться с упаковкой, а потом свой компрессор привинтить не сложно будет...

Использую пока Uses ZLib;
TCompressionStream и TDecompressionStream

Цитата:
Сообщение от Аватар Посмотреть сообщение
Для начала почитал бы например это
http://www.win-rar.ru/support/knowle...il.php?ID=1081
все таки умные люди разрабатывали. Идея записи оглавления в конец архива порочна - что делать при добавлении файлов в архив?
Читал, спасибо! Слишком сложно все, хочется как-нить, для начала, попроще, а потом уже и сложнее...

Архив возможно редактировать только, если он не разделен на несколько томов...
Ну вот пример:
Есть у нас архив с 3 файлами. Расположение его заголовка мы всегда знаем и можем его переписать. То есть можем указать в заголовке где находится структуры для навигации. Вот нам нужно записать 4-ый файл. Пишем его прямо в позицию, где находились структуры навигации, а за ним опять же записываем их.... И обновляем заголовок архива, там указываем что у нас уже 4 файла и позиция структур изменилась на .....

Вот мы и добавили файл...
SalasAndriy вне форума Ответить с цитированием
Старый 29.11.2013, 00:14   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Использую пока Uses ZLib;
Тю... Я думал наваял таки свой...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы при создании диалогового окна Sauber Win Api 0 14.11.2013 21:51
проблемы в создании отчета daimos91 Microsoft Office Excel 14 21.08.2010 13:51
Проблемы кодировки при создании .CFM страниц в Dreamweaver CS3 bp-alex Софт 1 01.05.2010 17:51
Проблемы в создании компонента amico Помощь студентам 6 15.11.2009 19:45
При создании формы! Anton Помощь студентам 4 08.08.2007 08:20