Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Запись файлов!!!


Автор: Fighter 9.1.2005, 03:55
Вы наверное играли в такие игры как Diablo II и Warcraft III. Компания Blizzard все необходимые файлы к своим играми "тщательно скрывает" в файлах типа MPQ. Как самому сделать что-нибудь подобное? Например, в ListBox'e я выбрал три файла
1. Music.mp3
2. Photo.jpg
3. Text.txt.
Все эти три файла объеденены в один файл с именем datafile.dat.

Потом я открываю файл datafile.dat и у меня в ListBox'e появляются эти файлы:
1. Music.mp3
2. Photo.jpg
3. Text.txt.
причем, если я щелкну на Music.mp3 то начнется проигрывание музыки, если на Photo.jpg то откроется картинка в моей программе или сама Windows откроет её, ну соответственно если щелкну по Text.txt, то либо запустится Блокнот с текстом программы, либо текст откроет моя программа.

Подскажите пожалуйста как это сделать?

Автор: En_t_end 9.1.2005, 07:38
Fighter
Зачем темы расплодил?
Обьясняю подробно алгоритм...
ИМХО...
Берёшь первый файл, открываешь его в своём коде, как двоичный...узнаешь каким он был размером в байтах, ставишь первые байты, которые указывают на размер файла, записываешь далее сам файл в datafile.dat, надеюсь алгоритм считывания записи по-байтово расписывать не надо smile ?, если тебе надо записать новый файл, допустим 2. Photo.jpg, то опять же узнаешь его размер и пишешь, как двоичный всё тоже..........., естсесственно, если файл текствой, открываешь, как текстовой.
А вот тут уже интереснее, как проиграть или запустить ? smile, воспользуемся стандартной папкой TEMP, в сис. дир. виндузы...
Ах да ещё полезно и нужно, в начале datafile.dat указывать название запакованных файлов... читаем первые байты в твоём файле, анализируем... принимаем к сведению, читаем после информационных байтов до следующего инф. файла или столько байт, сколько занимал нужный файл... записываем извелёкшийся файл в TEMP, соблюдая правила имен и разрешений для вынды... запускаем из тэмпа creatprocess'ом нужный файл, и радуемся smile smile smile

ЗЫ зачем велосипед изобретаешь smile ?, все паковщики по такому принципу работают, ты уже первым не будешь... запускаем winrar, создаем любой архив без сжатия из нескольких файлов... и юзаем на здоровье...

Автор: _hunter 9.1.2005, 22:25
перед запуском такой программы замускаем filemon, смотрим что/куда прога сохраняет и переписываем нужные файлы.
смысл такой защиты?

что Diablo II что Warcraft III файлы используют сами, а если винду просить...

Автор: Fighter 10.1.2005, 02:37
Это не защита, это просто для удобства!!! Вот пример, предположим в какой-нибудь игре у меня 2000 файлов, каждый пусть занимает по 2 кб (для примера), а размер твоего харда 80 Гб, размер кластера в нем 32Кб и поэтому потери информации будет в 16 раз больше, а если все файлы содержатся в одном, то тогда потеря будет не больше 32 Кб.

Автор: chipset 10.1.2005, 03:31
Цитата(Fighter @ 9.1.2005, 15:37)
Вот пример, предположим в какой-нибудь игре у меня 2000 файлов, каждый пусть занимает по 2 кб (для примера), а размер твоего харда 80 Гб, размер кластера в нем 32Кб и поэтому потери информации будет в 16 раз больше, а если все файлы содержатся в одном, то тогда потеря будет не больше 32 Кб.

Нет. В FAT32 размер кластера - 4 кб.
..
В таких случаях обычно запихивают все в контейнер STL и сериализуют boost::serialization'ом.

Автор: Fighter 10.1.2005, 03:36
Это смотря на каких винтах. Вообще это легко проверить, вот я щас вот создал текстовый документ и ввел в него один символ. По идее размер документа 1 байт, что верно, но если файл может занимать один кластер, но в одном кластере не может быть два файла, поэтому если размер файла меньше размера кластера, то на диске все равно занимается место размером в кластер. Ну так вот, я сохранил этот текстовый документ и смотрю его свойства (у меня HD 60 Гб). Меня интересует следующее:

Размер: 1 байт, 32 768 байт занято.
32 768 - вот оно, вот он размер кластера у меня на HD в 60 Гб. Но я знаю что в NTFS можно выбирать размер кластера. А можешь поподробнее про boost::serialization.

Автор: chipset 10.1.2005, 03:38
Цитата(Fighter @ 9.1.2005, 16:36)
А можешь поподробнее про boost::serialization.

http://boost.org/libs/serialization/doc/index.html

Автор: Fighter 10.1.2005, 03:41
А можете тогда ссылку кинуть на какой-нибудь сайт (или несколько сайтов) где можно будет скачать какие-нибудь MFC классы, ActiveX, VCL компоненты для работы с архивами.

Автор: Helicopterr 1.10.2005, 22:26
да вот у кого есть ссылка на качнуть MFC классы?

Автор: szz 10.10.2005, 12:39
Вот например неплохая библиотека:
http://www.artpol-software.com/index_zip.html

Она довольно быстрая и хорошо, продуманно написана

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)