| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Склеивание файлов |
| Автор: sani79 10.4.2006, 18:42 |
| Народ, подскажите плиз самый простой способ склеивания файлов. То есть нужно получить что то типа архива, только без компрессии, а потом снова разобрать на исходные файлы. Компоненты не подходят. Может есть у когонибудь код процедурки? Или может кто нибудь просто подскажет самый простой способ. Заранее спасибо. |
| Автор: SoWa 10.4.2006, 18:46 |
| Самый просто способ если не знаешь TFileStream- склеивать по байтам Но лучше почитать про TFileStream и просто все сделать за пару строк. Не забудь в конце файла дописывать информацию о вклееных файлах. |
| Автор: sani79 10.4.2006, 18:49 |
| Хм.. Спасибо за идею... Так если в пару строк, может их опубликовать? Вдруг кому еще пригодится, да и разобраться проще будет.... |
| Автор: Snowy 10.4.2006, 18:50 |
| http://forum.vingrad.ru/index.php?showtopic=40647&view=findpost&p=313213 |
| Автор: sani79 10.4.2006, 18:52 |
| Спасибо Snowy, это то что нужно. Щас буду пробовать. |
| Автор: Snowy 10.4.2006, 18:58 |
| Эта проблема поднимается уже в 99-й раз. А у меня все руки не доходят мою утилиту дописать. Все. Решительно берусь. Пошел писать... |
| Автор: sani79 10.4.2006, 19:00 |
| Еще раз спасибо. Кстати на форуме не нашел (видно плохо искал). И в drkb. Пошел писать тоже |
| Автор: former 11.4.2006, 00:03 | ||
| Snowy, попробовал кад предложенный в тобой, только упаковывал файлы разных типов (txt, jpg, bmp). А при попытки выполнить следующий код ничего не происходит:
Что не так? |
| Автор: sani79 11.4.2006, 09:33 |
| хмм.. 1: ну во первых получил ошибку при компиляции в процедуре save: [Error] Unit1.pas(142): Incompatible types: 'TPersistent' and 'file' [Fatal Error] Project1.dpr(9): Could not compile used unit 'Unit1.pas' проблема решилась заменой assign на assignfile. Запись прошла. Размер архива навскидку правильный. Все отлично. 2. Процедура load: во первых понятно что максимальное имя файла 8 символов (задается в типе TFileNfo), мне это не удобно, заменил на 100. Ладно, но в итоге я получил файл размером в 5 байт (?), что естественно не является содержимым извлекаемого файла. Сейчас продолжаю трассировать. Есть у кого нибудь коментарии? Snowy? |
| Автор: Snowy 11.4.2006, 09:53 |
| Комментарии отсутствуют. У меня все отлично работает. Проверил - битмапа грузится без проблем. |
| Автор: Alexeis 11.4.2006, 10:09 | ||
sani79, у меня работает такой код
Добавлено @ 10:15 Файлы последовательно будут записываться button1, а затем последовательно извлекатся button2(в том порядке в котором были записаны). Число файлов естественно не ограничивается двумя. |
| Автор: sani79 11.4.2006, 10:24 |
| alexeis1, Спасибо, этот код у меня отработал как нужно. Все получилось. Странно что не работает вышеописанный код от Snowy, я уверен что он должен работать тоже. Попытаюсь все таки разобраться. Ради спортивного интереса. Всем спасибо! |
| Автор: Alexeis 11.4.2006, 10:43 | ||
| sani79, Я переделал код поприличней на много файлов вот привожу
Добавлено @ 10:44 Кстати побайтовое сравнение распакованных и исходных показало полное совпадение |
| Автор: sani79 11.4.2006, 10:56 |
| Да все работает на отлично. Я проверял dbfами. Никаких потерь. |
| Автор: Snowy 11.4.2006, 11:24 | ||||
| Долго пишу. Вот собрал 2 класса: * TFilesSaver - сохраняет кучу файлов в один * TFilesLoader - загружает файлы из пака
Пример использования:
Поэтому есть вероятность того, что в список попадут файлы с одинаковыми именами. Запишутся они корректно и прочитаются тоже. Просто осторожней с сохранением на диск. |
| Автор: Alexeis 1.12.2006, 16:26 | ||
По просьбе одного из участников выкладываю код извлечения имен файлов из архива.
|
| Автор: Evghenusi 1.12.2006, 16:58 | ||
| alexeis1 если тебе не трудно напиши как можно из файла "Result.dat" вытащить названия склеенных файлов в Listbox я написал такой код, но чтото не получается:
|
| Автор: Alexeis 1.12.2006, 17:43 |
| Evghenusi, ага я чуть-чуть опредил, решение выше |
| Автор: Evghenusi 1.12.2006, 21:24 |
| alexeis1 покажи мне, пожалуйста, где указывается адрес для распаковки файлов |
| Автор: Evghenusi 2.12.2006, 00:08 |
| я тоже сначала подумал что "S" это путь к папке но выходит ошибка. скачай архив и посмотри рисунок! |
| Автор: Alexeis 2.12.2006, 02:09 |
| Ничего удивительного я же не сказал туда писать директорию распаковки, а путь к файлу, т.е. это будет выглядеть так: f := TFileStream.Create(DirPath + s, fmCreate); где в DirPath - будет путь к папке для извлечения. При конкатинации мы получим полный путь к каждому из файлов для сохранения. Похоже вы не поняли как работает этот код... |
| Автор: Evghenusi 2.12.2006, 10:27 | ||
да ты прав! но я сделал как ты сказал, и выходит ошибка, путь получается 'C:\temt\C:\files\' путь куда я хочу извлечь и папка, откуда я брал файлы |
| Автор: Alexeis 2.12.2006, 16:10 |
| Evghenusi, если вы не хотите разбираться в сути, то используйте класс написанный Snowy он по крайней мере полнофункциональный (законченый), я же просто привел принцип для примера, как это делается. |
| Автор: Danя 14.5.2007, 19:10 |
| Как добавить файлы в уже созданый архив (*.pak) |
| Автор: Snowy 15.5.2007, 13:37 |
| Модификация паков не предусмотрена. Написать можно. Но цель была - создать 2 отдельных класса. 1 - для подготовки данных, которые будут использоваться в программе. 2 - для получения этих данных. В конечной программе подразумевалось использование только второго класса. Если нужно оба + модификация, то нужно писать один единый класс. Цель кода - не архиватор, а подготовка данных для использования в программе. Если нужен архиватор, то для этого нужно использовать соответствующие компоненты, либо подождать, когда я допишу свою утилиту... |
| Автор: Danя 15.5.2007, 16:48 |
| Ну может все таки можно как - то быстро добавить файлы в архив Я быстренько написал програмку которая упоковывает 6 файлов в архив и распоковывает файлы из какого-либо архива. Я делаю игру и мне нужно чтобы изображения (а возможно в дальнейшем и звуки) она [игра] брала из архива, который я сам создам, но так как изображений все больше и больше приходится каждый раз пересоздавать архив, а это очень нудно |
| Автор: Snowy 15.5.2007, 17:00 |
| Быстро добавить можно. А вот быстро написать новый единый клас не получится - много переделывать. |
| Автор: Danя 15.5.2007, 17:10 |
| Тогда скажи как папку засунуть в архив (*.pak) |
| Автор: Snowy 15.5.2007, 17:35 |
| Пофайлово - сканишь файлы FindFirst/FindNext, добавляешь каждый по Add. |
| Автор: Danя 15.5.2007, 18:02 |
| Snowy Пожалуйста поподробнее, я почти новичок в DELPHI |
| Автор: lukas 15.5.2007, 18:44 |
| Danя, все же просто... находишь один файл, загружаешь его в TMemoryStream, затем копируешь весь этот поток в конец главного потока например DirectStream (TMemoryStream) и так дальше, с каждым найденным файлом... ;) А потом DirectStream сохраняешь в файл. Для начала научись с потоками работать, а там и сам все поймешь... |
| Автор: Danя 15.5.2007, 19:05 |
| lukas, Пожалуйста можешь объяснить у меня очень мало времения!!! Мне через неделю показывать игру(хоть в каком - то виде), а у меня нифига ни сделано |
| Автор: Snowy 15.5.2007, 19:05 |
| lukas, человек спрашивал, как пользоваться FindFirst, а не теорию склеивания. К тому же со склеиванием всё давно решено - код в топе. Danя, видишь поле поиска вверху страницы? Введи туда FindFirst ;-) |
| Автор: Danя 15.5.2007, 19:21 | ||
| Snowy, Издеваешься да? Но всёравно спасибо Добавлено @ 19:25
Ну а как не папки а название файлов в Листбокс вывести?? Вы не думайте я не леньтяй просто архивация это второе дело (но не менее важное) главное саму игрушку дописать/написать |
| Автор: Danя 15.5.2007, 20:25 |
| Все ДОШЛО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! УРЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ ВСЕМ ОГРОМНОЕ СПАСИБО ПРОСТИТЕ, ЧТО ТУПИЛ |
| Автор: _KLAUS_ 7.8.2007, 18:20 |
| Snowy, Что делаю не так?? Три кнопки, нажимаю на первую создаётся "file.pak" На вторую создаётся папка "UnPack" - Но она пустая ..... На третью пишет "Bitmap is not avalid"..что не так-то?? Delphi 6 |
| Автор: _KLAUS_ 7.8.2007, 18:46 | ||
Ошибка
Я так понял, мы все нужные файлы в картинку пихаем, а как извлекать?? |
| Автор: Snowy 7.8.2007, 20:01 | ||||||
Неверно указал пути к файлам при упаковке. Посмотри размер pak - он небось байта 4. Значит ничего не запаковал. А значит и распаковывать нечего
У тебя в корне диска C: есть bmp, mp3 или rar? Нет? Вот потому ничего и не упаковал.
Они так и лежат в файле. Просто мы можем достать оттуда любой из файлов в стрим. В примере с картинкой мы вытаскиваем из пака первый файл в TMemoryStream, а потом этот стрим грузим в битмап. Почему первый? Да потому что при добавлении мы сначала добавляли bmp. Можно указывать не по звёздочке, а конкретный файл. Но это детали. Файлы сами по себе не достаются. Их нужно доставать через GetFile. GetFile найдёт в паке выбранный файл (если он там есть) и прочитает его в стрим. А дальше что хошь с ним, то и делай. |
| Автор: _KLAUS_ 8.8.2007, 06:32 | ||||
Да не, всё нормально, я правда только свои форматы запихал, а так они в корневом каталоге C:\ лежат , и *.pak получился нормального размера! Но папка UnPack всё равно пустая. И вот тут если я меняю значения на >0 , то файлы извлекаются но с нулевым размером!!
Добавлено через 3 минуты и 43 секунды Извлечение что-то не получается!! |
| Автор: lukas 14.9.2007, 18:35 |
| Откопал похожий компонент... TStreamDirector, может добавлять Файлы, Потоки, Списки... вообще тоже очень удобно... |
| Автор: lukas 14.9.2007, 18:37 |
| и вот еще один похожий... http://www.torry.net/vcl/vcltools/streams/hkstrm.zip |
| Автор: Apls 6.11.2007, 23:11 |
| Snowy, соглашусь с _KLAUS_. Сейчас разбираюсь с твоим исходником, тоже самое. Создается папка UnPack, но файло в ней нет, если в процедуре TFilesLoader.SaveFile поменять знак на ">", то файлы извлекаются, но с нулевым размером. Что делать? |