#SingleInstance Force
#Persistent
#MaxMem 4095
SetBatchLines -1
Source =
Dest =
ProgressStep := 1000
Gui, Add, Text, y+10 vText -Wrap r2 w555
Gui, Add, Progress, vProgress wp Range1-%ProgressStep%
Gui, Show
FileCopyDir( Source, Dest, 1, 1)
Return
; rewrite - Переписывать файлы
; recurse - Рекурсия в папки, т.е. всё содержимое. Иначе только файлы из корня.
FileCopyDir( Source, Dest, rewrite := 0, recurse := 0) {
Global ProgressStep
FileCreateDir, %Dest%
DelSource := StrLen(Source) + 1, AllSize := 0
Loop, %Source%\*.*, , %recurse%
{
If (!rewrite)
{
RASHNDOCT := FileExist( Dest . SubStr( A_LoopFileLongPath, DelSource))
If (RASHNDOCT != "" && !InStr( RASHNDOCT, "D"))
Continue
}
list .= A_LoopFileLongPath "`n"
AllSize += A_LoopFileSize
}
list := SubStr(list, 1, -1)
ByteStep := Ceil(AllSize / ProgressStep), IndexByteStep := 0
Loop, parse, list, `n
{
GuiControl, , Text, % "Сейчас копируется:`n" A_LoopField
DestFileName := Dest . SubStr(A_LoopField, DelSource)
If recurse
{
IsDestDir := SubStr(DestFileName, 1, InStr(DestFileName, "\", , -1))
RASHNDOCT := FileExist(IsDestDir)
If (RASHNDOCT = "" || !InStr( RASHNDOCT, "D"))
FileCreateDir, %IsDestDir%
}
DestFile := FileOpen(DestFileName, "w")
If rewrite
DestFile.Length := 0
File := FileOpen(A_LoopField, "r")
FileSize := File.Length
Seek := 0
Loop
{
If restBytes
{
End := bufSize := restBytes, restBytes := 0
If (End > FileSize)
restBytes := End - FileSize, bufSize := FileSize
}
Else
{
bufSize := ByteStep, End := Seek + ByteStep
If (End > FileSize)
restBytes := End - FileSize, bufSize := ByteStep - restBytes, Seek := FileSize - bufSize
}
File.Pos := Seek, DestFile.Pos := Seek
VarSetCapacity(buf, bufSize, 0)
File.RawRead(&buf, bufSize)
DestFile.RawWrite(&buf, bufSize)
If restBytes
Break
GuiControl, , Progress, % ++IndexByteStep
Seek := End
}
}
GuiControl, , Text, Готово
GuiControl, , Progress, % ProgressStep
DestFile := "", File := "", VarSetCapacity(buf, 0)
}
GuiClose:
GuiEscape:
ExitApp
Можете ещё прикрутить примерное оставшееся время и размер, а также скорость копирования. Возможно также отмену копирования на каждом (в данном примере - тысячном) этапе.
По скорости примерно на 3 - 5 % быстрее чем метод windows.
По вопросам возмездной помощи пишите на
E-Mail: serzh82saratov@mail.ru Telegram:
https://t.me/sergiol982Win10x64
AhkSpy,
Hotkey,
ClockGui