7-Zip [версия MSI]
У 7-Zip есть два установщика. Первый (обычный), как и у большинства программ для Windows, имеет формат EXE. Ссылки на него размещены на главной странице нашего сайта. Второй (альтернативный) имеет формат MSI. Ссылки на него вы найдете внизу этой страницы. Оба они не имеют внешних различий для рядовых пользователей ПК. Можете загружать и запускать любой.

Однако системным администраторам в некоторых случаях будет удобнее использовать MSI-версию программы. Это связано с удобством развёртывания по сети и возможностью удаленного запуска инсталлятора.
Преимущества и недостатки MSI-версии 7-Zip
- быстрая установка на множество компьютеров сразу, если они входят в одну инфраструктуру Windows;
- запуск инсталлятора без прав администратора через Active Directory или групповую политику;
- полная деинсталляция и откат всех изменений в файлах и реестре, в случае неудачной установки;
- с MSI проще настроить режим тихой установки с предустановленными значениями. Это опять же будет полезно тем, кто обслуживает несколько компьютеров и периодически запускает на них инсталлятор;
- для запуска MSI используется встроенная в операционную систему служба «The Windows Installer». Если она отключена, установщик не запустится.
Скачать MSI версию 7-Zip для Windows с разрядность 32 и 64 bit вы можете напрямую по ссылкам ниже. Либо скачайте обычный 7-Zip. Интерфейс у архиватора на русском, но язык нужно будет выбрать после первого запуска в настройках вручную.
7-zip — нет времени спешить

Данной заметки не должно было быть, но мы живем не в идеальном мире.
Есть много пользователей, что предпочли стандартному проводнику Windows альтернативу и наверное еще больше пользователей архиватора 7-zip. Имеет смысл поделиться с ними, подумал я и вот мы здесь.
Опустим лишние подробности, случилось так, что я заметил в используемом файловом менеджере значительную задержку появления окна контекстного меню при выборе большого количества файлов. Даже учитывая что его код меню написан без учета современных рекомендаций MS, лаг был подозрительно большим. И хоть никого не вдохновляет идея потратить личное время на неоплачиваемую работу с непредсказуемым результатом, я решил немного разобраться в причинах.
Что делает обычный эникейщик в подобной ситуации? Конечно же берет в руки первый подвернувшийся профайлер.

Итак, локальным виновником оказался метод IContextMenu::QueryContextMenu , а по факту все время съедает. 7-zip.dll
Эта библиотека является расширением оболочки и отвечает за добавление команд архиватора 7-zip в контекстное меню. Не то что ожидаешь увидеть по итогу, но стоит проверить.
Отключаем показ меню архиватора в настройках программы.

И убеждаемся, что собака порылась именно тут.
Ну раз такое дело, почему бы не проверить WinRar? Ничего похожего не наблюдается, лаг отсутствует.
Присмотримся
Для более чистого эксперимента закинем тестовую директорию на RAMDISK, а файловый менеджер заменим на что-то более очевидное, например Total Commander.
Сразу стоит отметить, что все изложенное не затрагивает проводник Windows, там своя внутренняя API магия, которая не ограничивается двухступенчатой инициализацией (сначала для первых 16 объектов, чтобы быстро отобразить меню, а после выбора команды, Invoke уже для полного набора). Все остальные файловые менеджеры почти поголовно подвержены проблеме, как впрочем и практически любой другой софт.
Что ж, попробуем вызвать меню в TC для файлов в нашей папке. Для наглядности сделаем количество побольше. Тест на 20k файлах выявил замедление более чем в х20 раз, а именно 3 секунды без 7-zip и более минуты! с ним.
Вообще, по логике вещей, расширения оболочки не должны вмешиваться в процесс создания меню настолько инвазивно.
Скучный спойлер. WinAPI и базовый алгоритм
Как обычно приложения создают контекстные меню.
Приведу упрощенное изложение стандартного алгоритма.
Небольшая отсылка к MSDN
Для большинства не секрет, что ОС для внутренних операций с объектами файловой системы использует не текстовые представления путей к которым мы привыкли, а некие альтернативные идентификаторы которые могут определять и виртуальные объекты.
Идентификатор элемента (функционально эквивалентен имени файла\папки) фактически является структурой SHITEMID . Список таких идентификаторов определяется структурой ITEMIDLIST .
Для API оболочки объекты пространства имен обычно идентифицируются указателем как раз на эту самую структуру — PIDL (Pointer to an ITEMIDLIST).
В общем, изначально, тем или иным образом приложение (например ФМ) должно преобразовать пути в список идентификаторов. Независимо от API ( ILCreateFromPath , SHParseDisplayName итп) в конечном счете будет вызван метод интерфейса IShellFolder рабочего стола Desktop.IShellFolder::ParseDisplayName , внутри которого для стандартных путей идентификаторы будут собраны из WIN32_FIND_DATAW, тут (на мой взгляд) можно было бы немного оптимизировать, но разработчикам виднее.
На Win10+ этот метод вызывается из windows.storage.dll ( CFSFolder::ParseDisplayName ), как и ряд методов ниже.
Затем обычно следует цепочка вызовов (упрощенный вариант):
В GetUIObjectOf мы передаем массив указателей на наши относительные идентификаторы и получаем на выходе интерфейс с дефолтным меню.
При, казалось бы, таком простом действии как создание меню, в действительности «за кулисами» происходит просто огромный объем работы.
Описание всего этого «цирка с конями» потянет на цикл отдельных статей, поэтому сфокусируемся на области используемой 7-zip.
Мы уже выяснили, что инициатор проблемной цепочки это QueryContextMenu.
Внутри CDefFolderMenu::QueryContextMenu происходит много разного
В зависимости от флагов поведение различается, однако базово, к пунктам дефолтного меню добавляются новые с объединением.
По типам объектов в списке сканируются соответствующие ветки реестра на наличие статических и динамических обработчиков.
Для динамики вызываются:
CDefFolderMenu::_AddHandlersToDCA
HDXA_QueryContextMenu
Условный CDefFolderMenu:
При сборе инфы реестра заполняются соответствующие пулы данных, в основном это:
Ассоциативный массив IAssociationArray (упорядоченный список путей реестра с информацией о типе, обработчиках, псевдонимах команд, иконках итп)
Три динамических массива структур — для статических (hdsaStatics), динамических (HDXA) обработчиков и массив SEARCHINFO (hdsaCustomInfo).
Впоследствии при вызове метода CDefFolderMenu::InvokeCommand , если команда ( verb ) не каноническая (из списка дефолтного меню) и не статика, функция HDXA_LetHandlerProcessCommandEx начнет перебор структур CONTEXTMENUINFO из массива HDXA и будет пробовать вызвать метод IContextMenu::InvokeCommand по указателю в начале структуры. И тут, либо какой-то метод успешно отработает, либо, если массив кончился, CDefFolderMenu::InvokeCommand вернет E_INVALIDARG
На этом этапе нужно подгрузить в адресное пространство процесса библиотеки всех востребованных динамических расширений меню, а в случае 7-zip, это практически всегда. И тут мы подходим к инициализации нашего обработчика.
Стоит держать в уме, что такой обработчик меню для программиста это зона высокой ответственности, ведь данный код будет выполняться при каждом вызове контекстного меню для объектов ФС и писаться он должен с максимальной оптимизацией.
Нужно больше тестов
Проверим сначала на единственном файле.
Создаем пустую папку и в ней пустой текстовый файл, аттачимся к TC и ставим bp 7_zip!DllGetClassObject
Запускаем выполнение процесса и вызываем контекстное меню файла. После остановки делаем трассировку. На данный момент мы увидим лишь портянку со змейкой вызовов много раз повторяющегося кода 7_zip!DllUnregisterServer+offset
Суммарный результат (не полной) трассировки:

У меня конечно есть нелюбовь к построению причинно-следственных связей, но даже мне кажется, что в текущем контексте, вызовов для модуля достаточно много. Конечно можно уже пробовать курить исходники и делать какие-то выводы, но мы пока не будем, хотя сырки все равно нужны. Чтобы было красиво и наглядно нам не хватает символов для 7-zip.dll.
Ну, это дело пяти минут.
Забираем с оффсайта архив, в CPP/Build.mak дописываем в CFLAGS /Zi, в LFLAGS /DEBUG и проставим -Od в CFLAGS_OX
Выполняем в командной строке студии (x64 Native)
cd /d X:\7z2201-src\CPP\7zip
nmake /f makefile CPU=AMD64 (Если сильно спешите, скомпилируйте только dll)
Теперь у нас есть отладочные символы. Добавим путь к ним и сыркам для отладчика.
Также подменим библиотеку в папке архиватора. Повторим трассировку и посмотрим топ.
С символами все стало достаточно наглядно. Посмотрим стек на самой часто вызываемой функции.
Тк отладка у нас с исходным кодом, быстро пробежавшись по строчкам, понимаем что к чему. Все эти аллокации происходят при парсинге файла локализации (src\CPP\Common\Lang.cpp).
Конечно странное решение.
Почему бы не брать строки по указателям из закешированного шаблона?
Зачем каждый раз самоотверженно парсить один и тот же файл локализации (16Кб для ru) при каждом нажатии ПКМ? Медленные строковые операции стоит минимизировать прежде всего. Хотя что я докопался, это даже «не те дроиды» которых мы ищем.
Если указать профайлеру путь к полученным символам, мы увидим больше подробностей и там, но ничего принципиально нового, можно сразу открывать отладчик.
Перейдем в TC в тестовую директорию, где файлов побольше.
После срабатывания bp 7_zip!DllGetClassObject поставим точку остановки на SHELL32!DragQueryFileAorW и глянем стек.
На третьей остановке мы уже попадаем в цикл функции и можем отследить всю проблемную цепочку.
Вся цепочка вызовов с исходным кодом функций
Коротко по сути — мы кликаем ПКМ на файлах (например хотим посмотреть свойства, или удалить), TC инициализирует процесс создания меню и подгружает расширения, дело доходит до 7-zip.
И тут 7-zip такой:
— Минуточку! Есть мнение, что вы недостаточно страдаете от оверинжиниринга реализации контекстного меню MS и я буду в буфер получать строки файловых путей для каждого выбранного объекта. Мне ведь надо проверить, что вы там выбрали и соответствующие пункты меню показать, чтобы все «по красоте».
— Кто вам сделал удобное меню?
— Кто молодец? А. вот то-то же!
Безусловно стояла задача сделать пользователю «удобно», но стоило бы потестить и конечную реализацию удобняшек. А по факту мы имеем много бесполезной работы съедающей время.
Также в CDrop::QueryFileName вместо того чтобы один раз выделить буфер достаточного размера, вся цепочка с DragQueryFileW для каждого объекта вызывается дважды, умножая и мою печаль.
В общем, стоит все таки иногда прислушиваться к рекомендациям MS, как это делает WinRar и не пытаться объять «необъятное».
Псевдокод из функции в rarext.dll (расширение WinRar)
Причины найдены. Делаем выводы.
Ситуация неоднозначная, поскольку с одной стороны это проблема подавляющего большинства софта, мало кто следует гайдлайнам и мы имеем медленные меню. Но с другой, 7-zip забивший на рекомендации, вносит дополнительные задержки.
Как и где поправить код для 7zip (тем кто захочет это сделать), надеюсь понятно.
Сам я еще тот гуманитарий и поэтому оставлю поиск и разбор прочих недоработок в сырках архиватора тем кто разбирается в вопросе и кому это интересно.
Тестирование производилось на
последнем ванильном билде 7-zip v22.01 от 2022-07-15
Windows 10 Pro 21H2 19044.1320 x64 , CPU 3800МГц
При желании быстро воспроизвести похожий результат (задумайтесь о жизни, если оно возникло), можете воспользоваться командным файлом для создания тестовой директории.
При запуске создаст рядом с собой папку TEST с 20k текстовыми файлами нулевого размера.
Затем открываете любой ФМ кроме штатного проводника, Ctrl+A и ПКМ .
Многие пользователи TC скорее всего не используют архиватор «классическим» образом, но это совершенно не важно в рамках рассматриваемой проблемы.
Можно было бы обойтись без отладки и сразу смотреть исходники, но часто ситуация бывает не столь однозначна, как выглядит на первый взгляд и в попытке сэкономить десяток минут, можно потратить больше, или что-то упустить.
Кто-то может сказать, что все это ерунда и можно в общем-то игнорировать при современных мощностях железа, а с действительно большими количествами файлов мало кто работает. Это ваш выбор, пусть этой зимой вам будет чуть теплее, чем остальным, просто чаще вызывайте меню
Мораль проста — не все динамические расширения одинаково полезны, а если вы их пишете, надеюсь, умеете «в оптимизацию».
Ну и убирайте всё неиспользуемое из меню (ShellExView в помощь).
7-Zip для Windows

7-Zip — отличный архиватор для Windows к достоинствам которого можно смело отнести комфортную скорость работы, поддержку всех современных форматов и высокую степень сжатия (для форматов ZIP и GZIP, программа предлагает сжатие которое в 2-10 % лучше чем сжатие предоставляемое архиваторами PKZip и WinZip). Приложение интегрируется в Проводник Windows. Присутствует версия для командной строки и плагин для FAR Manager, который позволяет работать с архивами без внешних архиваторов.
- Высокая степень сжатия благодаря новому формату 7z с компрессией LZMA
- Большое количество поддерживаемых форматов, включая 7z, ZIP, GZIP, BZIP2, TAR, ARJ, CAB, CHM, CPIO, DEB, DMG, HFS, ISO, LZH, LZMA, MSI, NSIS, RAR, RPM, UDF, WIM, XAR и Z
- Для форматов ZIP и GZIP, архиватор предлагает сжатие которое в 2-10 % лучше чем сжатие предоставляемое архиваторами PKZip и WinZip
- Сильное шифрование в форматах 7z и ZIP
- Возможность самораспаковки для формата 7z
- Интегрирование в проводник Windows
- Мощный менеджер файлов
- Наличие версии для командной строки
- Плагин для FAR Manager
WinRAR — мега популярный архиватор, умеющий обрабатывать практически любые форматы архивов.
7-Zip — абсолютно бесплатный функциональный архиватор с высокой степенью сжатия и.
WinZip — мощная программа для работы как с Zip-файлами, так и с архивами других форматов.
Universal Extractor — простая программа для извлечения данных из инсталляторов приложений.
FreeArc — весьма неплохой архиватор, который оснащен разнообразными наборами методов сжатия, обеспечивая высокую степень упаковки данных и хорошую производительность.
Bandizip — это быстрый и мощный архиватор, поддерживающий работу со многими форматами архивов, такими как WinZip, 7-Zip, WinRAR и другими.
Отзывы о программе 7-Zip
AZJIO про 7-Zip 21.07 [15-02-2022]
Поддерживает много форматов, практически распакует всё. Жаль что многие пользователи выбирают архиватор по красивым картинкам и пропускают этот идеальный вариант.
14 | 17 | Ответить
Yuri про 7-Zip 19.00 [17-04-2021]
Знал о программе давно, но сегодня просто «открыл» её. Год мучился, не мог удалить длинный файл-ссылку (.url) с рабочего стола. Перепробовал все известные способы. Только в этой программе смог переименовать файл и потом обычным способом удалить. Снимаю шляпу перед разработчиком.
21 | 19 | Ответить
Zoya про 7-Zip 19.00 [25-12-2020]
Добрый вечер! Скачала 7 zip с сайта софтпортал.Стала открывать, пишет, приложение не является проверенным корпорацией Майкрософт.Предлагает установить из Store, но тоже не получается. Скачала с офиц.сайта 7zip- download.ru. Хотела открыть ,но пишет, что Файл 7 zip-20.02.х64 — 02.10. 20 ехё подозрителен. Подскажите с какого сайта скачивать, боюсь попасть на вирусы
16 | 35 | Ответить
Admin в ответ Zoya про 7-Zip 19.00 [29-12-2020]
Во-первых, 7zip-download.ru не является официальным сайтом! Обходите такие сайты стороной.
На софтпортале можно скачать как с серверов softportal.com, так и с официального сайта, разницы нет, файл загрузится один и тот же (ссылки находятся на странице загрузки).
Официальный сайт программы — 7-zip.org.
27 | 30 | Ответить
Знаток про 7-Zip 19.00 [14-12-2020]
Новые версии понимают архивы не только с русскими паролями, но и такие: ya.
17 | 23 | Ответить
7-Zip free for PC, Mac
You will be automatically redirected to the homepage in 30 seconds.
7-Zip is an open-source program for compressing and decompressing files. It stands out for supporting a wide variety of compression formats, besides being very easy to use and featuring everything you can expect from this kind of utility. It allows you to extract, add, and test, as well as copy, move, delete, and manage compressed files.
What is 7-Zip?
7-Zip is a free and open-source file archiver utility used to compress and decompress files and any kind of pieces of data. It was originally developed by Igor Pavlov in 1999, and it is still widely used worldwide.
What are the key features of 7-Zip?
- Efficient: Usually, 7-Zip compresses to 7z format 30-70% better than to zip format. And 7-Zip compresses to zip format 2-10% better than most of the other zip-compatible programs.
- Self-extracting: This handy feature lets you create archives that can be automatically extracted when executed so that the end user doesn't need 7-Zip to be installed locally.
- Divide and conquer: If compressed files are too heavy, and you cannot send or share them in a single piece of data, you can seamlessly use the split features that will break your compressed archives into multiple smaller archives.
- High compatibility: It can pack and unpack files in the 7z, XZ, BZIP2, GZIP, TAR, ZIP, and WIM formats. It can unpack files in the APFS, AR, ARJ, CAB, CHM, CPIO, CramFS, DMG, EXT, FAT, GPT, HFS, IHEX, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, QCOW2, RAR, RPM, SquashFS, UDF, UEFI, VDI, VHD, VHDX, VMDK, WIM, XAR and Z formats.
- Security: Designed with security features, you can encrypt your compressed data and make sure no one can access it.
- Agnostic: You can use it seamlessly via the graphical user interface or the command line, which allows you to create automation pipelines to process your data efficiently.
- Large capacity: You can compress files up to 16 exabytes, which is 1.000.000.000 GB.
- Worldwide: It is available in 87 different languages, so almost everyone can use it.
© 7-Zip
How to use 7-Zip?
This is super simple, either right-click on the file you want to decompress and select the 7-Zip application or use the command line interface with the proper arguments depending on your needs.
Is it free?
Yes, 7-Zip is 100% free to use.
Is it safe?
The app has no history of security issues and supports AES-256 encryption, so we consider it perfectly safe to use.