Pasha_ZZZ wrote: ↑Sat 21 May, 2022 09:05
Папка 33 гига
Ну и не надо. Вроде, всё заработало.
Pasha_ZZZ wrote: ↑Sat 21 May, 2022 09:05
фар просто висит долгое время
Я же писал, что без визуализации прогресса.
Pasha_ZZZ wrote: ↑Sat 21 May, 2022 09:05
И выделение, кстати, не снимает
Исправил.
Pasha_ZZZ wrote: ↑Sat 21 May, 2022 09:05
висит долгое время
Ну, быстрее, чем если встроить в плагин, точно не будет. Но на безрыбье и сам раком встанешь… .
Визуализацию прогресса могу доделать - не проблема. С точностью до файлов (не до байтов!). Просто чтоб не скучно было на панельки пялиться Но всё же не надо на каждый файл вызывать проверку - уже приятнее.
Pasha_ZZZ wrote: ↑Sat 21 May, 2022 09:05
Не думаю, что надо дальше продолжать дорабатывать скрипт
Я всё же доделаю до состояния работоспособности. А Вы можете ждать, пока плагин доделают.
local F = far.Flags
local ICId, FailId, SuccId = "E186306E-3B0D-48C1-9668-ED7CF64C0E65", win.Uuid"01672689-DED5-4BF6-A6EB-88A0B7EC0D0F", win.Uuid"A41F7DA9-F678-48F5-8159-BF615C4B9EB7"
local Mask="/.+\\.(md5|sfv|sha(1|3|256|512)|wrpl)/i";
local Process, Result, iSucc, iFail = false, nil, 0, 0
Macro{
id="4B2EC566-B05E-4900-BD56-C4A5449E57EB";
area="Shell";
key="CtrlC-C";
description="BAX - Проверка файлов по отмеченным hash-суммам";
flags="Selection"; -- EnableOutput RunAfterFARStart EmptyCommandLine NotEmptyCommandLine NoFilePanels NoFilePPanels NoPluginPanels NoPluginPPanels NoFolders NoPFolders NoFiles NoPFiles Selection PSelection NoSelection NoPSelection EVSelection NoEVSelection NoSendKeysToPlugins
condition=function(key, data) return Plugin.Exist(ICId) end;
action=function(data)
Result, iSucc, iFail = {}, 0, 0
local Src = {}
for i=1, APanel.SelCount do
local fn = panel.GetSelectedPanelItem(nil, 1, i)
if not fn.FileAttributes:match"d" then
fn = fn.FileName
if mf.fmatch(fn, Mask)==1 then
table.insert(Src, fn)
end
end
end
for _, v in ipairs(Src) do
Process = true
Plugin.Command(ICId, v)
end
local sItems = nil
if iSucc > 0 or iFail > 0 then
if iFail > 0 then
local aItems = {}
for _,v in ipairs(Result) do table.insert(aItems, v.text:sub(3)) end
sItems = table.concat(aItems, '\n')
end
table.insert(Result, 1, {text='Проверено ' .. iSucc+iFail .. ' файлов. Соотетствует ' .. iSucc .. '; не соответствует ' .. iFail})
Panel.Select(0, 0)
if iFail > 0 then
table.insert(Result, 2, {text='Список несоответствий:'})
end
else
table.insert(Result, {text='Файлов для проверки не найдено!'})
end
far.Menu({}, Result)
if sItems then Panel.Select(0, 1, 2, sItems) end
end;
}
--------------------------------
Event {
id = "F090A36D-BD02-4399-8C99-2DFC566545D8";
group = "DialogEvent";
description = "BAX - Обработка результатов проверки файла по Хеш";
condition = function(Event, Param)
if Process and Event == F.DE_DLGPROCEND and Param.Msg == F.DN_INITDIALOG then
local Id = (Param.hDlg:send(F.DM_GETDIALOGINFO) or {}).Id
if Id == FailId or Id == SuccId then
Param.Succ = Id == SuccId
return true
end
end
end;
action = function(Event, Param)
if Param.Succ then
iSucc = iSucc + 1
else
iFail = iFail + 1
local n = Param.hDlg:send(F.DM_LISTINFO, 2).ItemsNumber
for i=2,n do
table.insert(Result, {text=Param.hDlg:send(F.DM_LISTGETITEM,2,i).Text})
end
end
Process = false
Param.hDlg:send(F.DM_CLOSE, -2)
end;
}
buniak_a_h wrote: ↑Sat 21 May, 2022 09:42
Я всё же доделаю до состояния работоспособности
Лучше тогда может как с Ctrl+G? Чтобы скрипт автоматом закрывал окошки о результате проверки? И считывал из них имена с ошибками, если таковые есть. А в конце показывал, что получилось. Только вот как сделать, чтобы после отмены следующие файлы не проверялись - даже не знаю.
Сайт RHash из ридми много лет не але, надо заменить на сф или гитхаб.
Не указано, на какой версии RHash база сабжа.
В новых версиях RHash добавлялись новые алго. Из нужных - BLAKE2, он используется, например, в WinRAR. Скорость очень неплоха, по сравнению с тем же тормознутейшим SHA3.
Действительно, не але. Заменил ссылку, спасибо.
В текущей версии rhash 1.4.1. Я либу обновляю периодически, если есть что обновлять.
Pasha_ZZZ wrote: ↑Sat 21 May, 2022 09:48
Лучше тогда может как с Ctrl+G? Чтобы скрипт автоматом закрывал окошки о результате проверки? И считывал из них имена с ошибками, если таковые есть. А в конце показывал, что получилось.
Скрипт и так закрывает окошки с результатами проверки, выводимые плагином, и накапливает из них имена невалидных файлов, которые показывает в конце.
Pasha_ZZZ wrote: ↑Sat 21 May, 2022 09:48
Только вот как сделать, чтобы после отмены следующие файлы не проверялись - даже не знаю.
Думаю, я знаю. Вот сделаю визуализацию прогресса с кнопкой "Прервать" - и сможете прервать (естественно, не сразу, а после уже начатой проверки).
Макро-функция 'gethash' теперь возвращает строку 'userabort' если пользователь прервал операцию.
…
На самом деле хотелось бы, чтобы функция проверки файла по хэш-сумме в случае прерывания тоже возвращала что-то типа этого. Ну и вообще что-то возвращала (соответствует / не соответствует).
Вообще, почему-то для вычисления суммы используется Plugin.SynchCall, а для проверки - Plugin.Command. Логично было бы, чтоб механизм вызова как для генерации, так и для проверки был одинаковый. Ну, добавьте к "gethash" функцию "check"; вроде, всё для этого есть…
Ariman!
P/S. А вообще, где можно прочитать про параметры вызова Call? Функция (gethash), вид КС и имя файла - это я понимаю. А там (в искаробочных скриптах) ещё есть параметр true; это - что? Я не заметил, чтоб он на что-то влиял…
Last edited by buniak_a_h on Sun 22 May, 2022 05:39, edited 1 time in total.
buniak_a_h wrote: ↑Sun 22 May, 2022 05:34
На самом деле хотелось бы
Если б еще в вызове можно было бы указать callback-функу, в которую периодически бы передавалось текущее состояние проверки - можно было бы нарисовать настоящий прогресс.
Pasha_ZZZ wrote: ↑Sun 22 May, 2022 06:25
Если б еще в вызове можно было бы указать callback-функу
Это возможно сделать, используя MCTL_EXECSTRING. Макрос одним из параметров передаёт callback-функцию в текстовом виде. Плагин вызывает её с параметрами в моменты, когда надо обновить прогресс.
Pasha_ZZZ wrote: ↑Sun 22 May, 2022 06:25
Если б еще в вызове можно было бы указать callback-функу, в которую периодически бы передавалось текущее состояние проверки - можно было бы нарисовать настоящий прогресс.
Ну, это уже эстетство. А вот возвращаемые значения - необходимость. Как выяснилось, открытие немодального диалога для показа прогреса и возможности прерывания делает некорректным работу ивентов. hDlg:send("DM_GETDIALOGINFO") возвращает nil !!! Так что идея с немодальным диалогом провалилась. Прерывание цикла по Esc (mf.waitkey(1)) тоже оказалось невозможным, т.к. Esc перехватывает плагин, начинает диалог подтверждения и, увы, ничего типа userabort не возвращает. Так что прервать (казалось бы, элементарное желание!) у меня не получилось Да и вообще, получение результата по ивенту на результирующий диалог - это как-то криво. Очень хочется просто анализировать ответ.
buniak_a_h wrote: ↑Sun 22 May, 2022 09:01
Очень хочется просто анализировать ответ.
По идее, реализация проверки нескольких выделенных файлов все-таки будет полнофункциональна только в самом плагине. На луа получаются только костыли с компромисами в виде частичной потери функционала.
buniak_a_h wrote: ↑Sun 22 May, 2022 05:38Ariman!
P/S. А вообще, где можно прочитать про параметры вызова Call? Функция (gethash), вид КС и имя файла - это я понимаю. А там (в искаробочных скриптах) ещё есть параметр true; это - что? Я не заметил, чтоб он на что-то влиял…
Четвертый параметр это Quiet - показывать диалоги (ошибки, вопросы и т.д.) или нет.
Pasha_ZZZ wrote: ↑Sun 22 May, 2022 06:25
Если б еще в вызове можно было бы указать callback-функу, в которую периодически бы передавалось текущее состояние проверки - можно было бы нарисовать настоящий прогресс.
А чем существующий прогресс не нравится? Макровызов считает указанный хеш для одного файла, для него же прогресс и показывает.
buniak_a_h wrote: ↑Sun 22 May, 2022 05:34
На самом деле хотелось бы, чтобы функция проверки файла по хэш-сумме в случае прерывания тоже возвращала что-то типа этого. Ну и вообще что-то возвращала (соответствует / не соответствует).
Нет никакой отдельной функции проверки файла. Есть одна единственная функция gethash, которая считает хеш для одного файла. Полученный результат можно сохранить, можно сверить с существующим или ещё как использовать.
Отдельно есть префикс, которому можно скормить хешфайл. Это эквивалентно вызову проверки из меню. Но это не макрофункция, а классический префикс, который можно из командной строки дергать.
Ariman wrote: ↑Sun 22 May, 2022 09:43
А чем существующий прогресс не нравится? Макровызов считает указанный хеш для одного файла, для него же прогресс и показывает.
Потом выводит окошко с результатом (и останавливается). Если через Ctrl+G для выделенных файлов - окошко после каждого файла. И нет общего прогресса. И чтобы отменить подсчет - нужно отменять для каждого из непроверенных файлов.
Самое интересное, что опция для создания подобного набора есть (Отдельные хэш-файлы), а проверить весь набор сразу не получится, только поодиночке.
Если хочется красивее, то, как вариант, можно макросом слить все файлы в один временный, подсунуть его плагину, а потом, когда он закончит, файл удалить.