lazyhamster / Observer

Compound plugin for FAR File Manager for content extraction from various file containers.
33 stars 5 forks source link

NSIS: фантомные каталоги (с сердечками) #2

Open johnd0e opened 6 years ago

johnd0e commented 6 years ago

https://download.filezilla-project.org/client/FileZilla_3.34.0_win32-setup_bundled.exe В корне, и не только, отображаются странные папки, с сердечком в имени.

Внутри можно найти и искомое содержимое, но разбито по папкам оно не совсем корректно. В итоге распакованное приложение запускается с ошибкой (некоторые графические ресурсы попадают не туда).

Этот же файл arclite распаковывает без проблем.

lazyhamster commented 6 years ago

Это не фантомные каталоги. Это я не сподобился до сих пор сделать поддержку юникодных инсталях. А 7зипе оно если, а у меня пока нет.

ziceptor commented 5 years ago

Мы терпеливо ждём :)

VictorVG commented 5 years ago

В v1.12 Git 8a66d15 имена видны корректно:

V1.11.2:

v1 11 2

v1.12.0 Git 8a66d15:

v1 12 0

, но алгоритм распаковки, особенно если встречается /LZMA /SOLID пока работает медленно . Для теста брал mkvtoolnix-64-bit-31.0.0-setup.exe c https://www.bunkus.org/videotools/mkvtoolnix/ . Распаковка происходит с многочисленными переходами по дереву каталогов и в итоге занимет 121 сек. Берём ArcLite с 7z.dll v18.06 - там данная операция займёт порядка 1 сек, в Observer 1.11.2 - ~2,4 сек (по секундомеру). Но, ошибок в распаковке не было.

lazyhamster commented 5 years ago

Это ожидаемо. Сейчас тут 7zip 18.06 практически без изменений. Оптимизацию под solid архивы я отдельно накручивал на оригинальный код 7zip-а, там не предназначено для распаковки по одному файлу. Самое сложное теперь вспомнить всё что я там наоптимизировал и портировать в новый код.

VictorVG commented 5 years ago

Это да, главное что уже алгоритм работает. И не получить этот подарок - "comctl32.dll bug with the TaskDialogIndirect API which is triggered by sending the TDM_NAVIGATE_PAGE message from a non-gui thread to the main gui thread message loop for the dialog". Эта ошибка появилась в Vista, но не устранена и в десятке.:) Видимо руки не дошли.:)

VictorVG commented 5 years ago

Поглядел на том же тесте с MKVToolNix Git 7835ddff2 - индикатор дёргаться перестал, время распаковки сократилось до 01:49 Основое время было затрачено на HTML хелп - там много мелких файлов.

VictorVG commented 5 years ago

Посмотрел Git c2e545b на FileZilla_3.42.1_win64-setup.exe - фантомных каталогов нет, NSIS 3.0 поддерживается, но время распаковки превысило четыре минуты,в то же время ArcLite b306 с 7z.dll 19.00 - около 4 секунд. В FZC много мелочи в ресурсах и при копировании на флешку они копируются дольше всего. Тут нужна оптимизация типа "считали оглавление каталога, временно сделали его текущим и начали копирование только файлов от него, Его подкаталоги обходим последовательно после копирования всех файлов в нём выполняя операции копирования аналогичным способом". В черновом варианте идея алгоритма такая, его цел исключить операции перехода в корневой каталог архива и обратно между файлами находящимися на одном уровне вложенности. Это по идее должно ускорить распаковку...

lazyhamster commented 5 years ago

В NSIS-е нет каталогов у запакованых файлов. Все каталоги в скрипте прописаны и не зависят от порядка файла в запакованом блоке. 7зип распаковывает либо пачкой быстро, либо по одному медленно, на каждый вызов позиция solid-архива сбрасывается в начало. Чтобы Observer тоже быстро распаковывал, нужно это обойти. Пока способа рабочего не нашел, то что использовалось в старой версии не походит.

johnd0e commented 5 years ago

Пока способа рабочего не нашел,

Распаковывать все, а писать только нужные?

lazyhamster commented 5 years ago

Не, тут другое. Плагин же по одному распаковывает файлы, а не пачкой сразу как 7зип. Это 7зип как раз так делает, сбрасывает поток в начало и распаковывает всё подряд, записывая только выбранные файлы на диск. В прошлой версии я добавил код, который пропускал сброс позиции solid-блока в начало, если файл на распаковку был дальше по потоку. А в этой версии глюки пошли. Подход то тот же будет, а вот реализацию надо найти правильную.

VictorVG commented 5 years ago

Понял, будем искать варианты алгоритма.

johnd0e commented 5 years ago

В прошлой версии я добавил код, который пропускал сброс позиции solid-блока в начало, если файл на распаковку был дальше по потоку.

Что значит "если"? А когда файлы записаны в обратном порядке?

lazyhamster commented 5 years ago

Если следующий файл раньше в потоке стоит, то сбрасываем позицию на начало. Как 7zip делает. Тут уже без вариантов.

VictorVG commented 5 years ago

johnd0e В NSIS не применяется сортировка - как автор записал в скрипте список операторов File "patch" так стуб и исполняет его, а указание на каталог куда распаковывать или копировать задаётся директивой SetOutPath "dir" которая может задаваться как для отдельного файла, так и для их группы. Например как у меня в коде:

SetOutPath "$INSTDIR\plugins\intchecker"
  SetOverwrite on
  File "Far\plugins\intchecker\file_id.diz"
  SetOverwrite try
  File "Far\plugins\intchecker\intchecker2.dll"
  SetOverwrite on
  File "Far\plugins\intchecker\intcheckereng.lng"
  File "Far\plugins\intchecker\intcheckerpol.lng"
  File "Far\plugins\intchecker\intcheckerrus.hlf"
  File "Far\plugins\intchecker\intcheckerrus.lng"
  File "Far\plugins\intchecker\intcheckerspa.lng"
  SetOverwrite try
  SetOutPath "$INSTDIR\plugins\luamacro"

где задаётся один целевой каталог, а когда требуется его сменить ставится новый SetOutPath. и тут я действительно забыл что компилятор NSIS пакует файлы в непрерывный архив группируя их по целевому каталогу в его оглавлении. Хотя наверное это и забавно так как у самого в скриптах вечно стоит режим сжатия заданный оператором SetCompressor /SOLID lzma.

johnd0e commented 5 years ago

В NSIS не применяется сортировка

Я ничего о сортировке не писал кажется. Файлы имеют определённый порядок, и оптимальная скорость распаковки будет достигнута только если именно в этом порядке и будем распаковывать.

А вот панель фара может быть отсортирована произвольно. Допустим мы распаковываем 2 файла, один из которых в инталляторе физически идёт последним, первым, а другой - последним: что если мы начнём с последнего?

lazyhamster commented 5 years ago

Если в плагин пришла команда на распаковку пачки файлов, то он их сортирует перед отправкой в модуль по порядковому номеру (в порядке поступления из модуля при чтении списка). Для NSIS-а это практически всегда совпадает с их порядком в solid-блоке.

VictorVG commented 5 years ago

При последовательных операциях точка отсчёта и направление чтения не играют роли т.к. время инкремента/декрента адресного счётчика (1 такт - +/- единица ммладшего значащего разряда на синхроимпульс) значительно меньше времени его перезагрузки новыми данными (от 3 тактов и выше: сброс - запись - переход в состояние счёта). Заметное увеличение длительности вызывают только операции с произвольным доступом вследствии необходимости вычисления и записи в счётчик адреса нового значения после каждой операции.