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

Вниз

Свой .mpq файл   Найти похожие ветки 

 
Alexey_   (2004-01-20 16:34) [0]

Я создал программу которая сохраняет не 1 файл для последующей загрузки, а целых 60; общиий размер сохраняемых фалов порядка 5 мб.

Как создать что-то типа .mpq файла?
.mpq файл - файл папка - в нем могут храниться другие файлы и папки соответственно. Отличием от папки является то, что его нельзя просто так открыть нажатием кнопки Enter :).

Сопутствующие вопросы:
1) Как записывать другие файлы внутрь этого файла?
2) Как читать файлы из такого файла?


 
YuRock ©   (2004-01-20 16:47) [1]

Посмотрите работу с интерфейсами IStorage/IStream.
Это примерно то, что Вы хотите - Storage-хранилище(папка), Stream - поток в хранилище(файл).
Работа с ними производится через методы этих интерфейсов (названия практически идентичны функциям работы с файлами) а так же с помощью ф-ций:
StgOpenStorage();
StgCreateDocfile();
и еще нескольких.

Кстати, на этом формате построена работа с файлами doc и xls (MS Office) и MB (конфигурации 1C)


 
easy ©   (2004-01-20 16:50) [2]

MPQ Control ActiveX
http://www.extractor.ru/download.php?action=get&id=138&PHPSESSID=291a40ef99612ea199edd1539644bac2


 
Dingo   (2004-01-21 08:56) [3]

Ну вы, блин, даёте! :-О
А что, типизированные файлы уже отменили? Создать нужную тебе структуру заголовка, где прописывались бы названия и смещения отдельных файлов, уже не судьба?
А после этого заголовка шли бы "впритык" те файлы, которые тебе сохранить надо.
Если очень уж трудно заголовок самому придумать - можешь воспроизвести структуру корневого каталога и FAT, хотя это и не оптимально совсем....
Вообще, иногда просто добивает склонность некоторых дельфистов искать готовые громоздкие и ненужные компоненты, вместо того, чтобы просто 10 минут подумать и за полчаса написать, что нужно, и как нужно именно для данной конкретной ситуации... Тем более, если нужно, чтобы так просто этот файл нельзя было открыть и прочесть -> свой формат, однозначно.


 
Строитель   (2004-01-21 10:56) [4]

2 Dingo
при чем тут типизированные файлы?


 
YuRock ©   (2004-01-21 12:53) [5]

> Dingo (21.01.04 08:56) [3]

Вы считаете, что придумать, сделать и отладить "файловую систему в одном файле" со всеми возможностями и способами обращения, как в Windows для NTFS и/или FAT можно легко сделать за 10 минут? Если да - то Вы либо не понимаете, о чем говорите, либо Вы непризнаный гений.

> готовые громоздкие и ненужные компоненты

При чем здесь компоненты?! Я лично говорил о Windows API.


 
lucky_elf   (2004-01-21 21:17) [6]

2YuRock
Я вообещем-то не совсем понял причем тут NTFS? и винда причем? про них не сном не духом в этом вопросе. И почему же тогда не файловую систему SUN Solaris она круче (и файлы до 9 терабайт поддерживает и востанавливается быстро).
Было дано одно из правельных решений написать структуру самому, а для наглядности или примера взять FAT - File Allocate Table - Таблица размещения файлов, что воовсе не означает полный набор функций (приложений/утилит) для работы с ней - т.е. было предложено взять только структуру, про NTFS вообще я ничего не понял, он зачем? А реализация действительно возможна за полчаса, надо только оговорить, реализация чего? а за пол часа я лично бы смог реализовать (и отладить):
0. разработать простую конфигурацию. (без вложенных папок)
1. функцию для записи всех файлов в один файл (далее упаковка).
2. функцию для чтения файла из упаковки по имени.

Вот так и не так страшен черт как его молюют!!!

ЗюЫю к сожалению не знаю WinAPI так хорошо, поэтому промолчу :)

2Динго. Браво так жержать!

2Alexey.
Есть еще один способ. Если тебе надо запаковать файлы один раз и потом только их читать (как это сделано в StarCraft - *.mpq, Quake1,2,3 - *.pak и других игрухах), то можно скачать одну из бесплатных библиотек для работы с архивами - обычно они умеют только распаковывать :(, но этого вполне хватает, ну по крайней мере у меня была похожая задача и я использовал UnZip библиотеку - заодно и сжать можно, а чтобы не прочитали можно дать расширение файлу *.dat или еще какое нибудь, а от самых умных можно придумать и еще что нибудь, например файл зипа можно отличить (как впрочем и многие другие) по первым 2-м байтам, которые идентифицируют файлы зипа - так вот заменить эти байты и соответственно подправить исходник зипа, в том месте где он проверяет эти байты.
Такие библиотеки есть в инете - надо поискать на сайтах программистов или в форумах, я лично видел ZIP, PAK, IMP - умеет читать RAR и еще кучу всего.

Бест реградс!


 
YuRock ©   (2004-01-22 10:37) [7]

> lucky_elf (21.01.04 21:17) [6]
> А реализация действительно возможна за полчаса, надо только оговорить, реализация чего? а за пол часа я лично бы смог реализовать (и отладить):
0. разработать простую конфигурацию. (без вложенных папок)
1. функцию для записи всех файлов в один файл (далее упаковка).
2. функцию для чтения файла из упаковки по имени.


Вы бы вопрос вначале почитали ( > Как создать что-то типа .mpq файла?
.mpq файл - файл папка - в нем могут храниться другие файлы и папки соответственно
),
а затем уже говорили о том, за какое время Вы бы смогли написать такой формат файла.


 
Amoeba ©   (2004-01-22 15:30) [8]

Лучшее решение см.

> YuRock © (20.01.04 16:47) [1]


 
Holy ©   (2004-01-22 15:44) [9]

Я может чего-то не понимаю, но зачем изобретать велосипед?


 
Lucky_elf   (2004-01-22 20:48) [10]

2YuRock

Что-то типа - это я так понимаю, имеющее схожую структуру, но не значит точно такое же, иначе можно взять уже готовое.

Вопрос я прочел и дал вполне реальные решения:
1. Написать самому (я пояснил, чтобы я смог сделать из предложенной задачи за 30 мин и более того - я же не сказал, что реализую полноценную файловую систему отвечающую современным стандартам с соблюдением всех стандартов ISO за пол часа, я так же и не сказал, что то, что я сделаю именно и просил этот парень - внимательно надо читать тебе! А если так подумать быть может ему и хватит перечисленных функций, или может стоит отказаться от СЛОЖНОЙ структуры и хранить ТОЛЬКО файлы, на этом экономим время нервы и более четко концентрируемся на ГЛАВНОЙ задаче. Кстати я не думаю, что работа с WinAPI сильно облегчить задачу).

2. Взять одно из готовых решений, например тот-же mpq, pak, zip, rar и etc, благо этого в нете найти можно. (я бы на этом и остановился)

2Amoeba
это как ты определил? на мой взгляд готовая библиотека (например ЗИП) самое то, потому как:
1. Хелп прилагается.
2. Проверена временем.
3. Я с этим разобрался за пол часа
4. и папки туды тоже можно писать


 
Alexey_   (2004-01-24 17:13) [11]

Небольшая поправочка:
Файл будет содержать вложенные папки и разнотипные файлы: .txt .bmp .avi .wav .

За 30 минут, по моему, это не решить :).


 
Alexey_   (2004-01-24 17:16) [12]

PS Если можно, напишите алгоритм.


 
Palladin ©   (2004-01-24 17:55) [13]

ZIP(конкретнее один из вариаций LZW), именно этот формат использует IDSoftware (в Quake играл? ) в своих PAK файлах...
и ничего... никто не жалуется...


 
Lucky_elf   (2004-01-25 10:16) [14]

2Alexey_

Я же говорю мне по плечу выполнить без вложенных папок - за 30 минут. файл не имеет значения - все файлы состоят из 0110101001010101010 и etc, какой не возьми, а вот как ты интерпритирует их сожержимое это уже другое дело.

А вообще лучше используй готовый - типа ЗИП


 
Плохиш_   (2004-01-25 10:51) [15]


> Alexey_ (24.01.04 17:16) [12]
> PS Если можно, напишите алгоритм.

Вот так всегда. Дайте всё и нахаляву.


 
Lucky_elf   (2004-01-25 14:03) [16]

Я тут кое что накатал по этой теме, куда кинуть?
Лано я на свой сервак кину забирай оттуда.

Прога: Д7.
Правда мне самому не очень нравиться - сначала глючила - вроде все работает, а файлы больше 32767 не сохраняет, точнее сохраняет но выходной файл маленький, потом нашел
FileWrite и FileRead не могут работать с такими объемами, так что чтение идет побайтно, не совсем хорошо, но это только "учебный "пример реализации и не больше, к тому же если, скорость для тебя критична, то это можно поправить

ЗюЫю прога написана на скорую руку, так что в нет практичеаки никаких проверок на допустимые операции, т.е.
работать надо примерно так:
1. Запускаешь :)
Елси надо запаковать, то жмешь " Добавить", делаешь так сколько надо, потом жмешь " Сохранить" - сохраняешь их все в один

Если надо распаковать, жмешь " Открыть", выбираешь тот файл который у тебя получился, после чего ты увидишь его содержимое, т.е. сколько и чего в нем есть, выбираешь нужный жмешь " Распаковать" указываешь куда и какое имя и все получаешт свой файл

ЗюЫю2 Когда откроешь файл добавить в него и удалить что-то нельзя если надо то делай сам основа рабоает

Желаю удачи!

ftp://ftp.kamensk.donpac.ru/upload/goldsoft/Packer.zip


 
Alexey_   (2004-01-25 18:13) [17]

Огромное спасибо.
Этого исходника хватит. Немного доведу его до идеала для моей задачи...
Еще раз спасибо.


 
Ihor Osov'yak ©   (2004-01-25 18:37) [18]

2 [16] Lucky_elf

> а файлы больше 32767 не сохраняет, точнее сохраняет но выходной файл маленький, потом нашел
FileWrite и FileRead не могут работать с такими объемами,

Неужели? Или может это Вам просто показалось?


 
Palladin ©   (2004-01-25 18:53) [19]

Мда... эльф действительно удачливый....


 
Lucky_elf   (2004-01-25 19:26) [20]

2Ihor Osov"yak © (25.01.04 18:37) [18]

> Ihor Osov"yak © (25.01.04 18:37) [18]
> 2 [16] Lucky_elf
>
> > а файлы больше 32767 не сохраняет, точнее сохраняет но
> выходной файл маленький, потом нашел
> FileWrite и FileRead не могут работать с такими объемами,
>
> Неужели? Или может это Вам просто показалось?


Я чего-то не понял, это ты так шутишь? или думаешь чего не понимаю, если так то объясни мне, а если нет то хотябы смайлы ставил, чтобы было понятней, а чёй-то я юмора не понял

Delphi syntax:

function FileWrite(Handle: Integer; const Buffer; Count: Integer): Integer;



Судя по выше приведенному описанию видно, что не может он т.к. Integer он из 2-байт и не моежт быть более 32767.


 
Palladin ©   (2004-01-25 19:37) [21]

Integer + F1


 
Lucky_elf   (2004-01-25 21:29) [22]

2Palladin ©


> Integer + F1


я ВООБЩЕ-ТО от туда и взял это. А вообще к чему ты это


 
Palladin ©   (2004-01-25 22:03) [23]

Прочти еще раз и очень внимательно то что написано в справке...


 
Rouse_ ©   (2004-01-25 22:14) [24]

> Lucky_elf (25.01.04 21:29) [22]
Ну и чего ты там увидел?


 
Rouse_ ©   (2004-01-25 22:22) [25]

> Integer он из 2-байт и не моежт быть более 32767.
Орешник ... однозначно...... ;))))))))))))))))

Зы: Смайлов хватит? ;)


 
Lucky_elf   (2004-01-25 23:10) [26]


> Palladin © (25.01.04 22:03) [23]
> Прочти еще раз и очень внимательно то что написано в справке...


Мдя действительно, косячек вышел, понадеялся, что осталось как пасе. Теперь я не вижу разницы в Integer и LongInt. Вот за что я и не люблю Пас/Делф. :)


> Rouse_ © (25.01.04 22:22) [25]
> > Integer он из 2-байт и не моежт быть более 32767.
> Орешник ... однозначно...... ;))))))))))))))))
>
> Зы: Смайлов хватит? ;)


Орешник так орешник, прально туды его,
Integer он из 2-байт и не моежт быть более 32767 - это не означает не верно полностью, это не верно только для 32-битного компилятора, так?

Человек не может знать всего и уследить за всем.

2Rouse_ ©
Смайлов хватит :)


 
Palladin ©   (2004-01-25 23:13) [27]


> Теперь я не вижу разницы в Integer и LongInt.

Стоит различать понятия Generic types и Fundamental


 
Lucky_elf   (2004-01-26 07:13) [28]

Так вот и объясни. Я на Д пишу крайне редко, в следствии чего я даже не знал о существовании
> Стоит различать понятия Generic types и Fundamental


 
Palladin ©   (2004-01-26 07:27) [29]

кратко:

был в TP Integer 2, а стал 4 причем он Generic и, кстати, дальше он будет 8...
Longint как был так и остался, ведь он Fundamental...

NOTE: в расчете на это и следует писать программы, что бы потом не истоптать клавиши Ctrl-Q-A...


 
Lucky_elf   (2004-01-26 18:54) [30]

Ну в вообщем-то не фига я не понял разницы, т.е. зачем делать Integer как LongInt?

> NOTE: в расчете на это и следует писать программы, что бы
> потом не истоптать клавиши Ctrl-Q-A...


Сори! но в это я вообще не въяхал :(



Страницы: 1 вся ветка

Текущий архив: 2004.02.06;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.019 c
1-16331
oleg_SYS
2004-01-24 21:27
2004.02.06
Где находятся в реестре пункты контекстных меню?


6-16564
Andersen
2003-12-02 14:04
2004.02.06
Что это за инфу выдает 80-ый порт?


3-16187
korvin
2004-01-13 18:13
2004.02.06
В последней ли я записи ??


1-16360
Andrys
2004-01-24 08:48
2004.02.06
Текст на экране


1-16494
Dmitriy
2004-01-27 14:52
2004.02.06
Ввод числа.