Данный проект был сделан в рамках учебного курса по языку Python.
Консольная утилита
Архивирует любые файлы (текстовые, бинарные и т.д.) и директории используя алгоритм LZW
(Алгоритм Ле́мпеля — Зи́ва — Уэлча)
Параметры ввода:
- action - действие, которое будет произведено с файлом/директорией:
- archive (a, arch) - архивация файла/директории
- dearchive (d, dearch) - деархивация файла с расширением .lzw
- input_path - путь к файлу/директории, к которой нужно применить действие
- output_directory (опционально) - путь к директории, в которой будет сохранён выходной файл/директория. По умолчанию: директория, в которой лежит входной файл/директория
- replacement - флаг, при его наличии после архивации/деархивации входной файл/директория удаляется
- output_file_name (опционально) - имя выходящего файла. Если параметр не указан, то будет использоваться оригинальное имя файла
Чтобы использовать, необходимо перейти в директорию с проектом и ввести в консоли:
python main.py action input_path
С дополнительными параметрами: python main.py action input_path.ext -s output_directory -r output_file_name
Пример архивации:
- python main.py archive C:\Users\Username\file.txt -s C:\Users\Username\Archives
- Результат: в директории Archives будет создан файл file.lzw - сжатый файл file.txt
- python main.py a C:\Users\Username\dir -s C:\Users\Username\Documents
- Результат: в директории Documents будет создан архив dir.lzw - архив исходной директории
Пример деархивации:
- python main.py dearchive C:\Users\Username\Archives\archive.lzw -s C:\Users\Username\Documents dearchive
- Результат: в директории Documents будет создан файл dearchive.txt - распакованный файл file.lzw
- python main.py d C:\Users\Username\Archives\dir.lzw -s C:\Users\Username\Dirs
- Результат: в директорию Dirs будет разархивирована директория dir со всеми её файлами и поддиректориями
- Архиватор использует алгоритм LZW с очищением словаря фраз, когда он достигнет длины 4096, на один код максимум 12 бит
- Длина кодов увеличивается динамически по мере роста словаря. Изначально словарь заполнен всеми 256 байтами, начальная длина кода - 9 бит. Когда в словаре окажется 512 элементов, длина кодов вырастет до 10 бит, когда окажется 1024 элемента - до 11 бит, когда окажется 2048 элементов - до 12 бит, когда окажется 4096 кодов - словарь сбрасывается до 256 начальных байтов
- Код 256 зарезервирован, как код очистки словаря. Если словарь переполнен, то кодировщик добавляет код 256 в выходной поток и очищает словарь. Если декодировщик получает код 256, то он обновляет свой словарь
- При архивации файла в начало архива записывается служебная информация:
- "магическое число" (сигнатура данных) - 5 байт. Идентификатор формата. Значение: LZW26
- файл или директория - 1 байт. Необходимо для деархивации. Значение: f или d соответственно
- длина расширения файла - 1 байт
- расширение файла - "длина расширения" байт
- длина имени файла - 2 байта
- имя файла - "длина имени" байт
- размер исходного файла - 8 байт. Используется в качестве проверки корректности деархивации: должен совпасть с размером деархивированного файла
- время создания, изменения и доступа к файлу
- длина метаданных
- метаданные (если есть)
- При архивации файла отображается, сколько процентов размер архива занял от исходного файла
- Архиву даётся расширение .lzw
- Архиватор сохраняет метаданные у следующих форматов: mp3, docx, pdf
- Архиватор считает хэш-код исходного файла и записывает его в конец архива. При деархивации хэш-код разархивированного файла сравнивается с хэш-кодом исходного файла