Пост

Работа с RAR архивами в Go

RAR — популярный, но проприетарный формат архивов. Его последняя версия RAR5 использует закрытые алгоритмы, из-за чего поддержка в сторонних библиотеках крайне ограничена. Что касается Go — либо библиотеки устарели, либо не поддерживают RAR5, либо требуют внешние утилиты


📚 Формат RAR: особенности

Возможность Поддержка
Эффективное сжатие
Пароли (AES)
Восстановление данных
Многотомные архивы
Unicode в именах
Открытая спецификация
Open-source реализация

RAR5 требует лицензионных алгоритмов от RARLab. Это делает реализацию полноценной поддержки без внешних бинарников проблематичной.


🔎 Библиотеки Go для работы с RAR

Библиотека Пароли RAR5 Особенности
rardecode Чистый Go. Только RAR1–4. Не требует внешних зависимостей.
go-unarr ⚠️ ⚠️ CGO-обёртка над libunarr. Частичная поддержка RAR5. Только чтение.
xtractr Обёртка над rardecode. Поддержка Unicode, паролей.
archiver (deprecated) Устаревший универсальный архиватор. Использует rardecode, поддержка RAR ограничена. Рекомендуется переход на mholt/archives.
mholt/archives ✅* ⚠️ Кросс-платформенная библиотека. Читает 7z и RAR с паролями; ZIP с паролями — не поддерживает. Поддержка RAR — только чтение; для RAR5 — частичная (см. пояснение ниже).
Внешние утилиты (unrar, 7z) Полная поддержка. Требуется установка бинарников.

Примечания:

  • * — в mholt/archives поддерживается чтение паролей для 7-Zip и RAR; для ZIP пароли не поддерживаются
  • Для RAR5 во всех чисто-Go решениях поддержки нет; частичная поддержка обычно достигается через C‑библиотеки/обёртки и ограничивается чтением

Пояснения по поддержке/ограничениям:

  • rardecode
    • Только чтение, форматы RAR 1–4; RAR5 не поддерживается
    • Пароли не поддерживаются
    • Практически не покрывает сложные кейсы (solid, многотомность, восстановительные записи и т.п.)
  • go-unarr
    • Только чтение; запись не поддерживается
    • RAR5 — частично: «простые» односоставные архивы чаще открываются; многотомные/solid и “экзотические” варианты могут не работать
    • Пароли — частично; шифрование заголовков может не распознаваться
    • Требует CGO и системных библиотек (libunarr), что усложняет кросс-компиляцию/деплой
  • xtractr
    • Обёртка над rardecode → наследует его ограничения по RAR: нет RAR5
    • Пароли поддерживаются для RAR1–4; для RAR5 соответственно — нет
    • Удобный высокоуровневый API (фильтрация, кодировки имён), но базовые возможности зависят от rardecode
  • archiver (deprecated)
    • Проект устарел; для новых задач рекомендован mholt/archives
    • Для RAR использует rardecode → нет RAR5, нет паролей
  • mholt/archives
    • Частичная поддержка RAR5 в этом случае означает:
      • Только чтение (запись/создание RAR/RAR5 отсутствует)
      • Стабильнее работают одиночные не‑solid архивы; многотомные и solid могут не поддерживаться или быть нестабильными
      • Возможна распаковка с паролем, но шифрование заголовков и отдельные режимы могут не распознаваться
      • Сервисные структуры (recovery record, комментарии, EAs/ACL/ADS, ссылки, права/времена) могут игнорироваться
      • Совместимость варьируется между архиваторами; для проблемных кейсов лучше использовать unrar/7z
    • Пароли для ZIP не поддерживаются
  • Внешние утилиты (unrar, 7z)
    • Наиболее полная и надёжная поддержка RAR/RAR5, включая зашифрованные, solid и многотомные архивы
    • 7z не создаёт RAR, только извлекает; старые версии могут хуже справляться с некоторыми вариантами RAR5
    • Требуется наличие бинарников в окружении

🛠 Внешние утилиты (unrar, 7z)

1
2
exec.Command("unrar", "x", "simple.rar", "/out")
exec.Command("7z", "x", "protected.rar", "-pMYPASSWORD")
  • Поддержка всех версий RAR, включая RAR5
  • Работают стабильно, но требуют наличия бинарников

Пример установки (Debian/Ubuntu):

1
2
sudo apt update
sudo apt install unrar p7zip-full p7zip-rar

❓ Стоит ли готовить собственную реализацию?

Оптимальный вариант:

  • Пишем обёртку над unrar / 7z с fallback на xtractr и mholt/archives, что обеспечит максимальный охват функциональности для работы с архивами.

Проблемы:

  • Нельзя легально реализовать алгоритмы RAR5
  • Поддержка шифрования и многотомности — сложная и хрупкая область
  • Архивы RAR5 (особенно solid/многотомные) могут вести себя нестабильно в сторонних реализациях

✅ Что выбрать под конкретную задачу

Сценарий Рекомендация
Только RAR v1–v4 rardecode, xtractr
Поддержка RAR5 (надёжно) Внешние утилиты (unrar, 7z)
Допустим CGO и нужен read-only go-unarr или mholt/archives
Универсальность (ZIP/TAR/7z/RAR) mholt/archives (вместо archiver), с учётом ограничений по ZIP‑паролям и частичной поддержке RAR5
Гибкость и контроль Обёртка над unrar + fallback (xtractr/mholt/archives)

🧾 Вывод

Формат RAR, особенно RAR5, — проблемный для Go. Из-за закрытой природы и юридических ограничений единственный практичный путь для полной поддержки — использовать обёртки над внешними утилитами (unrar, 7z) и дополнять их:

  • xtractr — для старых архивов (RAR1–4) с поддержкой шифрования,
  • mholt/archives — как универсальный слой чтения, умеющий в пароли для RAR/7z, но без паролей для ZIP, и с частичной поддержкой RAR5 (только чтение, ограниченные сценарии).
Больше полезной информации в Telegram-канале