CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Здесь обсуждается всё, что касается макросов.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by buniak_a_h »

Скрипт делался в целях изучения ffi, но оказался довольно шустрым. Также, возможно, кому-то покажется полезным в качестве примера использования ffi, т.к. там (а) используется CallBack-процедура, (б) используются арифметические операции с типом cdata и (в) столкнулся с проблемой: параметры CallBack-функции должен быть типа LARGE_INTEGER, который является union-ом; но в этом случае возникает ошибка при приведении CallBack-процедуры к описанному СИ-типу (ffi.cast).
Теперь задача оформлена в виде модуля; кроме собственно процедуры копирования в модуле есть пример создания классов и готовые классы для отрисовки прогрессбара и вывода сообщения при помощи far.Text (использование объекта этого класса вместо far.Message ускорило копирование в несколько раз(!)) -. Возможно, кому-то покажутся удобными те утилиты, которые этот модуль предоставляет.


По-прежнему остались мелкая"непонятка": у функции CopyFileEx можно указать флаг COPY_FILE_RESTARTABLE (Ход выполнения копирования отслеживается в целевом файле в случае сбоя копирования. Сбойную копию можно перезапустить позже, указав те же значения для lpExistingFileName и lpNewFileName, которые использовались в сбойном вызове). А CallBack-процедура может вернуть значение PROGRESS_STOP (Остановить операцию копирования. Она может быть перезапущена в более позднее время). Но почему-то несмотря на указание этих параметров при прерывании копирования скопированная часть файла стирается. Если кто-то знает, как сделать "дописываемый" файл при поможи процедуры CopyFileEx - поделитесь, пожалуйста, секретом
Кроме этого в скрипте имеется процедура индикатора процесса (как проценты, так и бесконечный). Тоже может кому пригодится...
CopyFileEx_Lua.lua.7z
Модуль BaxUtils.lua с примером использования CopyFileEx_Lua
(7.66 KiB) Downloaded 94 times
Last edited by buniak_a_h on Fri 25 May, 2018 13:31, edited 4 times in total.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by buniak_a_h »

Latest post of the previous page:

John Doe wrote: Mon 14 May, 2018 07:23
buniak_a_h wrote: Sun 13 May, 2018 23:01 В документации ничего непонятно!
http://lua-users.org/wiki/DateAndTime
https://api.farmanager.com/ru/fsf/farclock.html
Спасибо, конечно... Много интересного прочитал. Но...
Первая ссылка рождает больше вопросов, чем ответов:
Модуль Hi Res Timer начинается с local alien=require"alien" - нет такого модуля... Дальше и читать не стал.
Модуль [Time] тоже начинается с local time = require "time", который тут же вызывает ошибку...
Про far.FarClock() я писал:
buniak_a_h wrote: Sun 13 May, 2018 23:01 Про far.FarClock ВООБЩЕ НИЧЕГО НЕ НАПИСАНО! Что за "number"??? Количество секунд с полуночи? Количество миллисекунд? Количество суток с 01.09.1896 01.09.1899
Ну и последнее. тесты показали, что для отсчёта интервала времени прекрасно подходит win.GetSystemTimeAsFileTime(). Вы считаете это некорректным? Почему? Про эту функцию хотя бы написано конкретно:
result: number
Description:
The system time is expressed as number of milliseconds since January 1, 1601.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by John Doe »

buniak_a_h wrote: Mon 14 May, 2018 08:19 Спасибо, конечно... Много интересного прочитал. Но...
Детальное описание os.clock, больше ничего не имелось ввиду
buniak_a_h wrote: Mon 14 May, 2018 08:19 Про far.FarClock() я писал:
Я читал что вы написали, а вот вы ссылку не открывали
buniak_a_h wrote: Mon 14 May, 2018 08:19 прекрасно подходит win.GetSystemTimeAsFileTime(). Вы считаете это некорректным?
Полагаю что GetSystemTimeAsFileTime подходит, хотя FarClock и точнее.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by buniak_a_h »

John Doe wrote: Mon 14 May, 2018 08:29 Я читал что вы написали, а вот вы ссылку не открывали
Да, извините. Увидел, что там про far.FarClock (точнее, про FSF.FarClock; но таблицы FSF нету, и единственную функцию FarClock я нашёл в таблице far), и решил, что я это уже читал...
Беспорядок в документации. Какая FSF??? Одна и та же функция описана в разных документах - какой читать? По логике - последний. И это - не FarEncyclopedia.ru.chm; он как раз - смый старый...
Ну, в общем, спасибо и извините за потраченное время. В любом случае сам ФАР копирует файл (как выяснилось, на твёрдотельном диске. На обычном не заметно) быстрее, чем и copy /b, и xcopy, и вызовом CopyFileEx без CallBack-рутины... Зато на сети (с подмапленного WebDAV-диска) этот скрипт на файле в 3 гб обгоняет ФАР на 17% (4' против 4'40"). Я не знаю, чем это объясняется, но это - факт, проверенный трижды. Жалко, не удалось победить докачку...
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by John Doe »

buniak_a_h wrote: Mon 14 May, 2018 08:55 Беспорядок в документации. Какая FSF??? Одна и та же функция описана в разных документах - какой читать? По логике - последний.
Не буду утверждать что всё идеально, или очень просто, но порядок тем не менее есть.
LuaFAR задуман как тонкая прослойка между Lua и АПИ плагинов, и в мануале у большинства функций отсутствуют подробные описания, чтобы не дублировать Энциклопедию.

FSF = Far Standard Functions.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by buniak_a_h »

John Doe wrote: Mon 14 May, 2018 09:09 чтобы не дублировать Энциклопедию.
Подход правильный. Но тогда вместо пустого описания returns number нужно было see hypperlink на энциклопедию (как во многих других местах).
Так, кстати, сделано в описании практически всех функций таблицы mf.
Только не расцените это как критику или претензии: это я оправдываюсь. Я прекрасно понимаю, что документация по факультативному проекту - дело самого нижнего приоритета. Потому и мысль про студентов пришла... :-)
Last edited by buniak_a_h on Mon 14 May, 2018 09:59, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by John Doe »

buniak_a_h wrote: Mon 14 May, 2018 09:58 вместо пустого описания returns number нужно было see hypperlink на энциклопедию
Не вместо, а вместе. Нужно, да.
buniak_a_h wrote: Mon 14 May, 2018 09:58 Вот откуда я могу знать, что поиск надо продолжить, что более подробное описание есть в другом документе?
Для LuaFAR первично АПИ плагинов, детально описанное в Энциклопедии.
Где искать какую документацию описано в шапках тем viewtopic.php?f=15&t=7302, viewtopic.php?f=15&t=4365
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by buniak_a_h »

Мне, например, непонятно, при чём тут АПИ плагинов, если я собственно плагины не использую... Как выяснилось, кроме LuaFAR (неявно). Без плагина LuaFAR макросов не существует вообще. Ну странный подход: работа с макросами (в т.ч. клавиатурными) кажется неотъемлемой функцией ФАРа, а оказывается, её обеспечивает внешняя (по отношению к ядру ФАРа) библиотека...
В общем, данный конкретный вопрос решён, а логику мне всё равно не понять. Как и Вам - логику пользователя, просто пишущего скрипт на LUA.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by John Doe »

buniak_a_h wrote: Mon 14 May, 2018 11:25 Как и Вам - логику пользователя, просто пишущего скрипт на LUA.
Логику пользователя я вот прекрасно представляю, и вовсе не утверждаю, что она "неправильная".

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

Пользователем "просто пишущим скрипт" остаться не получится.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by buniak_a_h »

Я, кстати, сделал скрипт (Макрос, реализующий функции плагина Active-Help), который после индексации сам ищет (и часто - неплохо) функции. Причём при первом проходе поиск контекстно-зависимый, поэтому получается неплохо. Увы, конкретно с far.FarClock не работает: сразу находит точное совпадение в luafar_manual.chm. А там - "result: number" :-(
Но в большинстве случаев помогает очень...
Last edited by buniak_a_h on Mon 14 May, 2018 11:44, edited 1 time in total.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by buniak_a_h »

John Doe, не подскажете? Я нашёл функцию Far.UpTime() (сколько времени (в миллисекундах) работает Far Manager (своё значение для каждой запущенной копии)). Правильно ли я понимаю, что это тоже самое, что far.FarClock() ?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by John Doe »

buniak_a_h wrote: Tue 15 May, 2018 06:49 функцию Far.UpTime()
Это не функция, а свойство, т.е. круглые скобки не нужны.
buniak_a_h wrote: Tue 15 May, 2018 06:49 Правильно ли я понимаю, что это тоже самое, что far.FarClock()
Не исключаю, что внутри они и реализованы сходным образом, но точно не идентичны: far.FarClock возвращает значение в микросекундах.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

CopyFileEx_Lua - копирование функцией CopyFileEx с визуализацией и возможностью снятия

Post by buniak_a_h »

Скрипт изменён. Оформлен в виде модуля. В этот модуль, кроме собственно функции CopyFileEx_Lua, включено несколько утилиток, а также функция создания класса и два класса.
Post Reply

Return to “Обсуждение макросов”