1 (изменено: Dr.Jekyll, 2014-11-13 01:05:30)

Тема: AHK: Реальный прогресс бар + копирование/удаление по файлу списка

Добрый вечер всем!

Сделал прогресс бар, который основан на расчете процентов общего объема копируемых/удаляемых файлов.
Функцию расчета процентов выдрал где-то на буржуйском форуме.

Собсна, вот код:

DestDrive := "J:" ; Целевой диск с файлами из списка TestFileList.txt . Файлы могут располагаться в любом диске

Gui Color, Black
Gui +LastFound +ToolWindow -Caption -Resize +AlwaysOnTop 0x800000
Gui Font, s10, Verdana

Gui Add, Progress, x10 y10 w280 h20 vIndicator c00C6FF Background000000
Gui Add, Text, x10 y10 w280 h20 +0x200 cFFFFFF +Center +BackgroundTrans vDonPercents
Gui Add, Text, x10 y+2 w280 h20 +0x200 c00C6FF +Center +BackgroundTrans vFilesName

Gui Show, w303 h55
WinSet Region, 0-0 w303 h55 R13-13
WinSet Transparent, 200

Loop read, % A_ScriptDir . "\TestFileList.txt" ; Считываем из файла листинга Fool Path всех файлов
    {
    StringLeft, WordDrive, A_LoopReadLine, 9 ; Выделяем из строк файла листинга слово DestDrive
    FileFPinList := RegExReplace(A_LoopReadLine, "DestDrive", DestDrive) ; Замещаем слово "DestDrive" на букву диска, где находятся искомые файлы
    SplitPath FileFPinList, FileName ; Имя считываемого файла
    FileGetSize, FileSize, % FileFPinList, K ; Получаем размер считываемого файла в килобайтах
    TotalSize += FileSize ; Объем всех файлов
    TotalFiles := A_Index ; Количество всех файлов (строк) в списке
    }
    
TotalSize := 100
Loop %TotalSize%
    {
    GuiControl 1:, DonPercents, % ProgressBar(28, A_index, TotalSize)
    Sleep 50
    }
;__________________________________________________________________________________________________________________
; Function

ProgressBar(Length, Current, Max, Unlock = 0)
    {
    Percent := (Current / Max) * 100
    if (unlock = 0)
        length := length > 97 ? 97 : length < 4 ? 4 : length
    percent := percent > 100 ? 100 : percent < 0 ? 0 : percent
    Loop % round(((percent / 100) * length), 0)
        Progress .= ""
        GuiControl 1:, Indicator, +1
    Loop % Length - round(((percent / 100) * length), 0)
        Progress := ""
    return progress round(percent, 2) "% завершено"
    }
    
Sleep 3000
ExitApp

Фрагмент файла листинга:

DestDrive\boot\fonts\segmono_boot.ttf
DestDrive\boot\fonts\segoe_slboot.ttf
DestDrive\boot\fonts\segoen_slboot.ttf
DestDrive\boot\fonts\wgl4_boot.ttf
DestDrive\boot\GFXBoot.gfx
... и т.д.

Не могу прикрутить обновление в прогрессе имен считываемых файлов.
Если добавить

GuiControl 1:, FilesName, % FileName

в цикл Loop read, % A_ScriptDir . "\TestFileList.txt", то файлы прокручиваютя слишком быстро. Если добавить Sleep, то перестает работать прогресс ... Уже мозги плавятся!

Как сделать? Пожалуйста, помогите допилить этот скрипт ...
Может что-то еще можно улучшить/модернизировать? ...

Благодарю за помощь!

Лучше день потерять, потом за пять минут долететь!

2

Re: AHK: Реальный прогресс бар + копирование/удаление по файлу списка

то файлы прокручиваютя слишком быстро

Ну так они видимо с такой скоростью и копируются.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Реальный прогресс бар + копирование/удаление по файлу списка

Функцию копирования/удаления я пока не прикручивал. Это момент листинга ...
Как синхронизировать? ....

Лучше день потерять, потом за пять минут долететь!

4

Re: AHK: Реальный прогресс бар + копирование/удаление по файлу списка

Функцию копирования/удаления я пока не прикручивал

Ну дык только от этого оно и зависит. На кофейной гуще, кто же подскажет.

Функцию расчета процентов выдрал где-то на буржуйском форуме

Кстати в чём плюсы?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Реальный прогресс бар + копирование/удаление по файлу списка

... уже забыл про эту тему.

Похоже, в варианте с процентами писать меньше ...

А как можно прикрутить виндюжатный прогресс к удалению по этому списку? Копирование я знаю:

objShell := ComObjCreate("Shell.Application")
objFolder := objShell.NameSpace(DestDir)
objFolder.CopyHere(SelectedFile)
objShell := objFolder := ""
Лучше день потерять, потом за пять минут долететь!

6

Re: AHK: Реальный прогресс бар + копирование/удаление по файлу списка

Допилил этот скрипт. Все работает отлично.

Только есть одна проблема - индикатор прогресса привязал к количеству файлов, поэтому на копировании больших файлов индикатор может "замерзать" на некоторое время. Может кто подскажет, как привязать движение индикатора к общему объему файлов в MB?

Буду очень признателен за помощь.

SourceDrive := "J:" ; Целевой диск с файлами из списка TestFileList.txt . Файлы могут располагаться в любом диске
Title := "Куда будем копировать файлы?"
FileSelectFolder, DestDir, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}, 3, % Title
If !DestDir
    {
    MsgBox Директория для копирования файлов не выбрана!
    ExitApp
    }
    
Loop read, % A_ScriptDir . "\TestFileList.txt" ; Считываем из файла листинга Fool Path всех файлов
    {
    FileFPinList := RegExReplace(A_LoopReadLine, "Drive", SourceDrive) ; Замещаем слово "Drive" на букву диска, где находятся искомые файлы
    SplitPath FileFPinList, CurrentFileName ; Имя считываемого файла
    FileGetSize, FileSize, % FileFPinList, M ; Получаем размер считываемого файла в мегабайтах
    TotalSize += FileSize ; Объем всех файлов в мегабайтах
    TotalFiles := A_Index ; Количество всех файлов (строк) в списке
    TotalFilesList .= FileFPinList "`n"
    }
    
Gui Color, Black
Gui +LastFound +ToolWindow -Caption -Resize +AlwaysOnTop 0x800000
Gui Font, s10, Verdana

Gui Add, Text, x10 y6 w380 h20 +0x200 c00C6FF +Center +BackgroundTrans, % "Количество файлов: " . TotalFiles
Gui Add, Progress, x10 y30 w380 h20 vIndicator c00C6FF Background000000 Range0-%TotalFiles%
Gui Add, Text, x10 y30 w380 h20 +0x200 cFFFFFF +Center +BackgroundTrans vDonPercents
Gui Add, Text, x10 y+2 w380 h20 +0x200 c00C6FF +Center +BackgroundTrans vFileName

Gui Show, w403 h80
WinSet Region, 0-0 w403 h80 R13-13
WinSet Transparent, 200

Loop, parse, TotalFilesList, `n
    {
    If A_LoopField
        {
        SplitPath A_LoopField, CurrentFileName ; Имя считываемого файла
        GuiControl 1:, FileName, % CurrentFileName
        GuiControl 1:, Indicator, +1
        GuiControl 1:, DonPercents, % PercentCount(A_index, TotalFiles) . "% завершено из " . TotalSize . " MB"
;        FileCopy % A_LoopField, % DestDir, 1
        Sleep 50
        }
    }
;__________________________________________________________________________________________________________________
; Function

PercentCount(Current, Max)
    {
    Percent := (Current / Max) * 100
    return progress round(percent, 2)
    }
    
Sleep 3000
ExitApp
Лучше день потерять, потом за пять минут долететь!