На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Создать архив из файлов, только функции СИ
    Всем хай! Сходу к делу!

    Вот допустим есть у меня 10 файлов на диске. Допустим умею сжимать их Хаффманом или арифметическим кодированием. А как их засунуть программно в архив, допустим с расширением ".xxx". Допустим, что знаю функции работы с файлами fopen, fgets и пр. функции языка СИ.

    Это вообще как реализуется??
    допустим, что гуглил, там чего-то через винапи мутят какую-то шляпу абсолютно мне непонятную.

    Есть простое и быстрое решение проблемы программным путем, допустим на "чистом" Си?)
    Сообщение отредактировано: FasterHarder -
      Цитата FasterHarder @
      ...А как их засунуть программно в архив, допустим с расширением ".xxx".

      Ты сам хочешь изобрести вариант или в поисках уже известного способа ?
        Цитата ЫукпШ @
        Ты сам хочешь изобрести вариант или в поисках уже известного способа ?

        может есть готовые функции какие-то в СТАНДАРТЕ си, типа ExtractFile, AddFileToArchive)
        если честно, то я даже технологию не представляю, как можно взять файл и добавить его внутрь другого файла...

        или без винапи здесь вообще ни туда ни сюда? но винапи такая шляпа сложная, что там с наскока вообще нереал что-либо сделать, годы потребуются на изучение винапи
          Цитата FasterHarder @
          или без винапи здесь вообще ни туда ни сюда?

          WinApi - это другая ось координат.
          Архивы и в DOS и в Linux бывают.
          На CodeProject можно вообще найти реализацию zip/unzip.
          ---
          "...взять файл и добавить его внутрь другого файла.."
          А что такого ?
          Ты же программист - значит изобретатель алгоритмов.
          Открываем некий файл на запись.
          2-й на чтение.
          Читаем последовательно 2-й и пишем данные в 1-й.
          Потом открываем на чтение 3-й.
          Продолжаем процесс.
          итд.
          По окончании закрываем 1-й файл - теперь внутри него много
          файлов, это "архив".
          ---
          Если сделать только это, тогда мы не сможем прочитав архив
          восстановить файлы на диске.
          Тогда перед файлом в архиве добавим служебную запись.
          Запишем туда имя файла, размер файла, способ упаковки,
          размер упакованного итп.
          Тогда можно будет:
          1.Перечислить файлы в архиве.
          2.Извлекать файлы из архива.
          3.Добавлять файлы в архив.
          4.Удалять из архива.
          ---
          Возможны варианты.
          Можно алгоритм файловой системы FAT реализовать - он не очень сложный.
          Сообщение отредактировано: ЫукпШ -
            Цитата ЫукпШ @
            Если сделать только это, тогда мы не сможем прочитав архив
            восстановить файлы на диске.

            хорошо, ты все правильно пишешь и что самое важное - я все понял из того, что написал мне - это оч.большая редкость на форумах, ооооооооооочень)

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

            а так в целом мне все понятно, спс) надо лишь разобраться со служебной инфой и можно кодить прожку.
              Цитата FasterHarder @
              а вот это служебная информация перед файлом ведь тоже по сути набор байт. Как мы их отличим от файловых байтов??

              По расположению их в файле.
              Сам файл можешь начать с метки вначале - что это именно "твой" архив.
              А дальше начинай придумывать формат (расположение) байт различного назначения.
              Тщательно опиши назначение каждого байта и его расположение в записи,
              чтобы потом не путаться.
              Например - начнём архивный файл с метки "XxMm".
              Дальше поставим цифры - версию архива. Допустим 1.0.
              Можно по-байтно подсчитать, сколько это сначала.
              Дальше пишем имя файла. С нулём на конце.
              Значит, можем определить длину. Дальше uint32 - длина файла в байтах.
              Затем байт - тип файла. байт - тип сжатия.
              Затем uint32 - упакованный размер.
              Как-то так. Далее сам файл (в количестве упакованного размера).
              Значит, мы точно можем определить начало и конец файла в байтах
              и начало следующей служебной записи.
              Итд.
              ---
              Может что я и забыл (или лишнего придумал) - дело творческое.
              Додумывай сам.
              ---
              Возможны варианты - можно все служебные записи соредоточить сначала
              архива, а далее - данные файлов.
              Тогда в служемной записи должно указываться смещение каждого файла от начала архива
              итд итп.
              ---
              я нечто такое делал - это не сложно, вариантов реализаций может быть много.
                Цитата ЫукпШ @
                или лишнего придумал

                не то, чтобы лишнее, а хочется попроще

                в общем решил так сделать:
                все в бинарном режиме:
                <кол-во файлов в архиве><имя файла><нуль-терминатор><сколько байт занимает><имя файла><нуль-терминатор><сколько байт занимает>...<байты 1го файла><байты 2го файла>...<байты Nго файла>EOF

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

                удаление файла из архива происходит побайтовым копированием с пропуском тех байтов, которые нужно удалить
                и т.д.

                ВРОДЕ все гладко или есть ужаснейшая ошибка в такой структуре, которая ставит КРЕСТ на этом???
                Сообщение отредактировано: FasterHarder -
                  а ведь у меня получилось!! хо!
                  правда я упростил донельзя) только каскадная архивация и распаковка + получение списка упакованных файлов
                  в прожке под 300 строк кода и около 12 функций

                  самый сложный момент был при распаковке учесть смещения всякие разные относительно начала файла и пр., чтобы получить доступ к байтам тела нужного файла
                  еще думал, что всякие графические форматы будут искажены после распаковки - не, все прошло круто!
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0340 ]   [ 16 queries used ]   [ Generated: 18.04.24, 08:15 GMT ]