Total7zip

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Reflector писал(а):7zG.exe запускается почти сразу, т.е. можно начать упаковку когда список еще не готов...
По идее, 7zG нельзя запустить до того как список готов. Раз запускается, значит, в этот момент список уже готов. А почему блокируется тотал - это уже вопрос.
Reflector
Сообщения: 56
Зарегистрирован: Вс ноя 29, 2009 17:51

Сообщение Reflector »

MVV писал(а): По идее, 7zG нельзя запустить до того как список готов. Раз запускается, значит, в этот момент список уже готов. А почему блокируется тотал - это уже вопрос.
Раз запускается сразу, значит не ждет окончания построения списка, т.к. тотал только размер той папки считает 4 сек :)
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Архиватору нужно передавать полностью построенный список. Возможности подкинуть еще файлов для упаковки нет. Поэтому невозможно запустить 7zG до окончания формирования списка.

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

Кстати, тут еще вопрос, кто больше тормозит - тотал или плагин. Тоталу ведь надо построить список файлов, который передать плагину - а если в папке 56 тыщ файлов, на это нужно время.

Еще можно время от времени вызывать функцию прогресса, чтобы юзер видел, какой файл обрабатывается - допустим, можно не на каждый файл, если их много, а на каждый десятый и т.п., чтоб интерфейс не сильно тормозил процесс. Например, пока файлов меньше 100, пишем на каждый файл, потом до 1000 на каждый 5-й, потом - на каждый 10-й.
Последний раз редактировалось MVV Чт дек 02, 2010 22:49, всего редактировалось 6 раз.
Reflector
Сообщения: 56
Зарегистрирован: Вс ноя 29, 2009 17:51

Сообщение Reflector »

MVV писал(а): Архиватору нужно передавать полностью построенный список. Возможности подкинуть еще файлов для упаковки нет. Поэтому невозможно запустить 7zG до окончания формирования списка.
А я о чем говорю? Запакуются только те файлы, которые на тот момент были с списке... Тебя послушать, так невозможно писать программы с ошибками :)
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Кстати, плагин использует не файл списка, а ту же хитрую методику, как и расширение оболочки - возможно, она позволяет строить список файлов на лету, я не знаю.
Аватара пользователя
mrmerak
Сообщения: 441
Зарегистрирован: Пн авг 20, 2007 03:48

Сообщение mrmerak »

От блин. Уже обрадовался и думал качать, но потом прочитал коменты от MVV и Reflector... :?
TC 9.51 | Win10 1903
Аватара пользователя
Total7zip
Сообщения: 287
Зарегистрирован: Сб ноя 27, 2010 03:22

Сообщение Total7zip »

что-то не так в этих комментах...
наверное то, что долго запускается диалог архивации, если для упаковки выбрать папку размером в несколько гигабайт?

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

тотал идет по "простому" второму пути. и получается, что например у меня в папке Windows на 64-битной Win7
15,6 GB и 96 283 Files, 21 346 Folders
пути хранятся как правило в строках, длинной MAX_PATH, это 255 символов по 2 байта. Тут я беру минимум, потому что на самом деле тотал, всегда когда дает пути к файлам в Unicode использует 1024 символа.
итого:
1)96 283 + 21 346 = 117629 (файлов и папок)
2)117629 * 256 * 2 = 60226048 (длина списка в байтах)
то есть тотал готовит для плагина список, размером приблизительно
60 МЕГАБАЙТ. (если считать по 1024 символа, то умножте размер обрабатываемой тоталом информации на 4). причем основные тормоза тут в файловой системе, так как это не просто строки а имена файлов, которые надо еще и получить.
3)дальше тотал передает этот "чудо" список не массивом указателей, а одной длинной строкой "сосиской", неизвестной длины. и чтоб разобрать его надо идти символ за символом -
если встретился 0, то это конец имени, после него начало следующего.
если начало следующего тоже 0, то список кончился.

я попробую оптимизировать с того места, когда начинает работать мой код, но по-моему сам метод порочный.

вывод - не надо упаковывать гигантские папки с помощью плагинов тотал коммандера. =)
Аватара пользователя
mrmerak
Сообщения: 441
Зарегистрирован: Пн авг 20, 2007 03:48

Сообщение mrmerak »

Total7zip
вывод - не надо упаковывать гигантские папки с помощью плагинов тотал коммандера. =)
вот с прошлым плагом была такая ж беда :( Приходилось для таких целей юзать обычный 7з через контекстное меню.
А хотелось бы по-крутому: закинуть 7z.dll и 7zG.exe - и не ставить каждый раз сам 7з
TC 9.51 | Win10 1903
Аватара пользователя
Total7zip
Сообщения: 287
Зарегистрирован: Сб ноя 27, 2010 03:22

Сообщение Total7zip »

я поищу обходные пути.
как мимнимум, для начала я могу "отпустить" тотал в тот момент когда он передал мне список, не дожидаясь запуска 7zG. тогда зависание не будет таким долгим.

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

Код: Выделить всё

%N places the filename under the cursor into the command line. 
%T inserts the current target path. Especially useful for packers.
надо попробовать. только не знаю как там с unicode именами дело обстоит.

но я все равно сделаю в плагине упаковку, изменение и удаление из архивов. на обычных папках, по-моему производительность нормальная.
Reflector
Сообщения: 56
Зарегистрирован: Вс ноя 29, 2009 17:51

Сообщение Reflector »

Total7zip писал(а): вывод - не надо упаковывать гигантские папки с помощью плагинов тотал коммандера. =)
Вот смотри, я даю паковать папку Win7 твоему плагину, через 7 сек в процессах появляется 7zG.exe, через 40 сек он появляется в панели задач(может вчера у меня запускался 7zG от предыдущих паковок когда я начинал следующие? :)) Затем я переключаюсь на свой плагин и 7zG начинает паковать уже на 6-й сек, потому что список, который он получает, состоит из одной строки "Windows". Я же писал в начале, что 7z не любит большие списки, а его упрощение операция довольно быстрая...
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

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

Согласен, неизвестная длина - это проблема. Но по идее здесь нужно лишь писать в файл символ за символом, а на каждом нулевом байте записывать в файл символ конца строки, а на паре нулевых - закрыть файл и передать его архиватору. Хотя, конечно, если используется не файл, а блок памяти, то всё сложнее, т.к. заранее определить необходимый размер блока невозможно. Но тут можно сделать всё в 2 прохода - за первый построить массив указателей на имена и длин (длины все равно понадобятся, как и указатели), заодно по ходу посчитав суммарную длину, а за второй - сделать остальную часть работы.

Все равно, думаю, больше по времени займет у самого тотала составление такого списка. Ведь ему придется перечислить содержимое всех выделенных директорий, по ходу дела фильтруя элементы, и при этом сохранить всё в памяти - и опять же, он не знает заранее, буфер какого размера ему понадобится, т.е. имеет проблему посерьезнее.
Reflector
Сообщения: 56
Зарегистрирован: Вс ноя 29, 2009 17:51

Сообщение Reflector »

MVV писал(а): Зато поддерживаются списки исключений, скрытые файлы и прочие "фишки" тотала.
Я все не мог понять причем тут списки исключений... Если ты пакуешь папку со скрытыми файлами, то они все окажутся в архиве, а если ты пакуешь zipом папку с файлами присутствующими в списке исключений, то они исключаются, т.е. если список исключений у вас не пуст, то нет никаких гарантий, что вы получите архив с оригинальными файлами. Вот что, по-твоему, можно прописать в этот список, чтобы оно случайно не исключилось из какого-нибудь архива? Примечательно то, что если паковать в tar или rar, то тотал передает им все файлы, даже если если они есть в списке исключений. Короче мне кажется, что паковать нужно все, иначе это будет лотерея...
Reflector
Сообщения: 56
Зарегистрирован: Вс ноя 29, 2009 17:51

Сообщение Reflector »

MVV писал(а): Все равно, думаю, больше по времени займет у самого тотала составление такого списка.
Я же написал, что у меня построение + перестроение списка занимает 6 сек.
Аватара пользователя
Total7zip
Сообщения: 287
Зарегистрирован: Сб ноя 27, 2010 03:22

Сообщение Total7zip »

Reflector писал(а):Я же писал в начале, что 7z не любит большие списки, а его упрощение операция довольно быстрая...
если можно, то расскажите как упростить список.
по-моему эта задача решения не имеет.
дано: список из N файлов и папок. например все они из Windows.
нужно: догадаться что этот список равен Windows\*

а вдруг в папке Windows на самом деле N+M файлов?...
по-моему "упростить" можно только одним способом -
найти общий корень, получить самому список всего что там есть и сравнить списки.

если у вас другое решение - с удовольствием воспользуюсь.

MVV писал(а): Все равно, думаю, больше по времени займет у самого тотала составление такого списка. Ведь ему придется перечислить содержимое всех выделенных директорий, по ходу дела фильтруя элементы, и при этом сохранить всё в памяти - и опять же, он не знает заранее, буфер какого размера ему понадобится, т.е. имеет проблему посерьезнее.
я даже добавлю, что я посмотрел из-за чего тормозит потом 7zG.
он идет по этому огромному списку файлов и проверяет каждую строчку как МАСКУ. так что тормоза включены на полную с обеих сторон.
Аватара пользователя
Total7zip
Сообщения: 287
Зарегистрирован: Сб ноя 27, 2010 03:22

Сообщение Total7zip »

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