Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.16.78.141] |
|
Сообщ.
#1
,
|
|
|
Всем хай! Сходу к делу!
Вот допустим есть у меня 10 файлов на диске. Допустим умею сжимать их Хаффманом или арифметическим кодированием. А как их засунуть программно в архив, допустим с расширением ".xxx". Допустим, что знаю функции работы с файлами fopen, fgets и пр. функции языка СИ. Это вообще как реализуется?? допустим, что гуглил, там чего-то через винапи мутят какую-то шляпу абсолютно мне непонятную. Есть простое и быстрое решение проблемы программным путем, допустим на "чистом" Си?) |
Сообщ.
#2
,
|
|
|
Цитата FasterHarder @ ...А как их засунуть программно в архив, допустим с расширением ".xxx". Ты сам хочешь изобрести вариант или в поисках уже известного способа ? |
Сообщ.
#3
,
|
|
|
Цитата ЫукпШ @ Ты сам хочешь изобрести вариант или в поисках уже известного способа ? может есть готовые функции какие-то в СТАНДАРТЕ си, типа ExtractFile, AddFileToArchive) если честно, то я даже технологию не представляю, как можно взять файл и добавить его внутрь другого файла... или без винапи здесь вообще ни туда ни сюда? но винапи такая шляпа сложная, что там с наскока вообще нереал что-либо сделать, годы потребуются на изучение винапи |
Сообщ.
#4
,
|
|
|
Цитата FasterHarder @ или без винапи здесь вообще ни туда ни сюда? WinApi - это другая ось координат. Архивы и в DOS и в Linux бывают. На CodeProject можно вообще найти реализацию zip/unzip. --- "...взять файл и добавить его внутрь другого файла.." А что такого ? Ты же программист - значит изобретатель алгоритмов. Открываем некий файл на запись. 2-й на чтение. Читаем последовательно 2-й и пишем данные в 1-й. Потом открываем на чтение 3-й. Продолжаем процесс. итд. По окончании закрываем 1-й файл - теперь внутри него много файлов, это "архив". --- Если сделать только это, тогда мы не сможем прочитав архив восстановить файлы на диске. Тогда перед файлом в архиве добавим служебную запись. Запишем туда имя файла, размер файла, способ упаковки, размер упакованного итп. Тогда можно будет: 1.Перечислить файлы в архиве. 2.Извлекать файлы из архива. 3.Добавлять файлы в архив. 4.Удалять из архива. --- Возможны варианты. Можно алгоритм файловой системы FAT реализовать - он не очень сложный. |
Сообщ.
#5
,
|
|
|
Цитата ЫукпШ @ Если сделать только это, тогда мы не сможем прочитав архив восстановить файлы на диске. хорошо, ты все правильно пишешь и что самое важное - я все понял из того, что написал мне - это оч.большая редкость на форумах, ооооооооооочень) я так понимаю, что перенос файлов делать будем (ну, хорошо, буду) ) побайтово. Файлы у нас сжаты. Байты в файлах неотличимы друг от друга. а вот это служебная информация перед файлом ведь тоже по сути набор байт. Как мы их отличим от файловых байтов?? Ведь при сжатии информации могут быть любые значения в байтах. а так в целом мне все понятно, спс) надо лишь разобраться со служебной инфой и можно кодить прожку. |
Сообщ.
#6
,
|
|
|
Цитата FasterHarder @ а вот это служебная информация перед файлом ведь тоже по сути набор байт. Как мы их отличим от файловых байтов?? По расположению их в файле. Сам файл можешь начать с метки вначале - что это именно "твой" архив. А дальше начинай придумывать формат (расположение) байт различного назначения. Тщательно опиши назначение каждого байта и его расположение в записи, чтобы потом не путаться. Например - начнём архивный файл с метки "XxMm". Дальше поставим цифры - версию архива. Допустим 1.0. Можно по-байтно подсчитать, сколько это сначала. Дальше пишем имя файла. С нулём на конце. Значит, можем определить длину. Дальше uint32 - длина файла в байтах. Затем байт - тип файла. байт - тип сжатия. Затем uint32 - упакованный размер. Как-то так. Далее сам файл (в количестве упакованного размера). Значит, мы точно можем определить начало и конец файла в байтах и начало следующей служебной записи. Итд. --- Может что я и забыл (или лишнего придумал) - дело творческое. Додумывай сам. --- Возможны варианты - можно все служебные записи соредоточить сначала архива, а далее - данные файлов. Тогда в служемной записи должно указываться смещение каждого файла от начала архива итд итп. --- я нечто такое делал - это не сложно, вариантов реализаций может быть много. |
Сообщ.
#7
,
|
|
|
Цитата ЫукпШ @ или лишнего придумал не то, чтобы лишнее, а хочется попроще в общем решил так сделать: все в бинарном режиме: <кол-во файлов в архиве><имя файла><нуль-терминатор><сколько байт занимает><имя файла><нуль-терминатор><сколько байт занимает>...<байты 1го файла><байты 2го файла>...<байты Nго файла>EOF насколько помню встроенного поиска информации в бин.файлах нет (типа функции strchr для строк), поэтому вся обработка побайтовая зная кол-во файлов будет легко встать на 1ый байт 1го файла, для этого нужно в цикле встретить столько же раз нуль-терминатор, а дальше через fseek(SEEK_CUR) смещение к началу нужного файла удаление файла из архива происходит побайтовым копированием с пропуском тех байтов, которые нужно удалить и т.д. ВРОДЕ все гладко или есть ужаснейшая ошибка в такой структуре, которая ставит КРЕСТ на этом??? |
Сообщ.
#8
,
|
|
|
а ведь у меня получилось!! хо!
правда я упростил донельзя) только каскадная архивация и распаковка + получение списка упакованных файлов в прожке под 300 строк кода и около 12 функций самый сложный момент был при распаковке учесть смещения всякие разные относительно начала файла и пр., чтобы получить доступ к байтам тела нужного файла еще думал, что всякие графические форматы будут искажены после распаковки - не, все прошло круто! |