Jump to content
Sign in to follow this  
scila1996

Copy File with Progress Bar on GUI !

Recommended Posts

scila1996

Sources file Copy.au3

 

#include <AutoItConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>

$Form = GUICreate("Form1", 578, 229, 192, 124)
$Src = GUICtrlCreateButton("Source", 32, 16, 105, 25)
$Dest = GUICtrlCreateButton("Destination", 32, 56, 105, 25)
$Input = GUICtrlCreateInput("", 160, 16, 385, 21)
$Output = GUICtrlCreateInput("", 159, 59, 385, 21)
$Copy = GUICtrlCreateButton("Copy Test", 32, 112, 105, 25)
$Progress = GUICtrlCreateProgress(32, 176, 513, 25)
GUISetState(@SW_SHOW)

Func _ProcessGetWinEx($ivPid, $svClass = "", $svTitle = "", $svText = "", $ivReturnOnlyFirstMatch = False)

    $ivPid = ProcessExists($ivPid)
    If Not $ivPid Then Return(SetError(1, 0, 0))

    Local $avwArray = WinList()
    Local $avRet[1] = [0]

    For $i = 1 To $avwArray[0][0]
        $avClass = DllCall("User32.dll", "int", "GetClassName", "hwnd", $avwArray[$i][1], "str", "", "int", 4096)
        If WinGetProcess($avwArray[$i][1]) = $ivPid Then
            If $svClass = "" Or (IsArray($avClass) And $avClass[2] = $svClass) Then
                If ($svTitle = "" Or StringInStr($avwArray[$i][0], $svTitle)) And ($svText = "" Or StringInStr(WinGetText($avwArray[$i][1]), $svText)) Then
                    $avRet[0] += 1
                    ReDim $avRet[$avRet[0]+1]
                    $avRet[$avRet[0]] = $avwArray[$i][1]
                    If $ivReturnOnlyFirstMatch Then
                        $avRet = $avret[1]
                        ExitLoop
                    EndIf
                EndIf
            EndIf
        EndIf
    Next

    Return $avRet

EndFunc

Func _CopyFile($Src, $Dest, $Prog)
    Local $PIDrun = Run(@ScriptDir & '\CopyPro.exe "' & $Src & '" "' & $Dest & '"', "", @SW_HIDE)
    Do
        GUICtrlSetData($Prog, WinGetTitle(_ProcessGetWinEx($PIDrun, "", "", "", True)))
    Until (Not ProcessExists($PIDrun))
    MsgBox(64, "", "copy complete")
    FileDelete($Dest)
EndFunc

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Src
            Do
                GUICtrlSetData($Input, FileOpenDialog("file src", "", "All File (*.*)", 0, "", $Form))
            Until (StringCompare(GUICtrlRead($Input), ""))
        Case $Dest
            Do
                Dim $s
                For $i = 1 To StringLen(GUICtrlRead($Input))
                    $s = StringRight(GUICtrlRead($Input), $i)
                    If (StringLeft($s, 1) = ".") Then ExitLoop
                Next
                GUICtrlSetData($Output, FileSaveDialog("file dest", "", "All File (*" & $s & ")", 0, "", $Form))
            Until (StringCompare(GUICtrlRead($Output), ""))
        Case $Copy
            _CopyFile(GUICtrlRead($Input), GUICtrlRead($Output), $Progress)
    EndSwitch
WEnd

Source Code file Copy_Pro.exe (Compiler with VS 2012)

 

#include <Windows.h>
#include <stdio.h>
using namespace std;

__int64 FileSize(const wchar_t* Fname)
{
    LARGE_INTEGER ullSize;
    GetFileSizeEx(CreateFileW(Fname, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL), &ullSize);
    return ullSize.QuadPart;
}

int wmain(int argc, wchar_t *argv[3])
{
    if (!(argc == 3)) return 0;
    FILE *F_src, *F_dest;
    if (!(F_src = _wfopen(argv[1], L"rb"))) return 0;
    _wremove(argv[2]);
    if (!(F_dest = _wfopen(argv[2], L"ab"))) return 0;
    int s;
    __int64 Fsize = FileSize(argv[1]), Fs = 0;
    wchar_t* Buf[1024 * 100];
    char title[4];
    while (!feof(F_src))
    {
        s = fread(Buf, 2, sizeof(Buf) / 2, F_src);
        Fs+=s;
        sprintf(title, "%d", (int)(((float)Fs / Fsize) * 200));
        SetConsoleTitleA(title);
        fwrite(Buf, 2, s, F_dest);
    }
    fclose(F_src);
    fclose(F_dest);
}

 

Copy_Prog.zip

Share this post


Link to post
Share on other sites
barkeeper

Awesome, thanks!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×