Progress progress ....API FileCopy Routine mit Progressbar

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
isidoro
Beiträge: 3
Registriert: 20.09.2004 10:13
Wohnort: Köln
Kontaktdaten:

Progress progress ....API FileCopy Routine mit Progressbar

Beitrag von isidoro »

Progress progress ....


Da ich nix wirklich gefunden hab, was rund läuft hab ich das gebastelt .. wer s braucht , Verbesserungen schaden ja auch nicht , also nix wie los...
Die Abfrage der Variablen ist nicht wirklich rund, liegt an den ULongs, aber das Grundsätzliche läuft ja und notfalls kann man den restlichen Kram mit PeekL ab der ersten Variablen auslesen, im 8 Byte takt, die ersten 4, dann alle weiteren normal alle 4 Bytes .... Na ja, so ähnlich ...

:mrgreen:
Freitag 8.okt.2004 23:56
Hab noch was dran editiert, weil die Routine nicht division durch Zero sicher war - ist behoben... Außerdem ging das Fenster nicht in jedem Fall automatich zu - auch OK tschöööö

Code: Alles auswählen


     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ;                                       ;
     ;    FileCopy Routine mit Progressbar   ;
     ;                                       ;
     ;    © copyright Isidoro Okt.2004       ;
     ;                                       ;
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;        
;
;
; CopyFileEx_ Konstanten
#PROGRESS_CONTINUE        = 0
#PROGRESS_CANCEL          = 1
#PROGRESS_STOP            = 2
#PROGRESS_QUIET           = 3
#COPY_FILE_FAIL_IF_EXISTS = 1
#COPY_FILE_RESTARTABLE    = 2

#ProgressWnd = 0
Enumeration
#CopyProgressBar
#CopyProgressText
#CopyProgressCancel
EndEnumeration


Procedure.l CopyProgressCallback(TotalFileSize , TotalBytesTransferred , StreamSize , StreamBytesTransferred , dwStreamNumber.l , dwCallbackReason.l , hSourceFile.l ); keine Ahnung Tschüss...>, hDestinationFile.l , lpData.l )
;#####################################################################################################################################################################
    TotalFileSize_ = (TotalFileSize>>16) &$FFFFFFFF
    StreamSize_    = 100 * (StreamSize>>16) &$FFFFFFFF
    If TotalFileSize_ > 0 And StreamSize_ > 0
      Prozent = 100 * (StreamSize>>16) &$FFFFFFFF / (TotalFileSize>>16) &$FFFFFFFF
    Else 
      Prozent = 100
    EndIf
    SetGadgetState(#CopyProgressBar  , Prozent ) 
    SetGadgetText (#CopyProgressText , "Orginal: " + Str(TotalFileSize)+ " Bytes     " + Str(StreamSize)+" Bytes transfered" ) 
    If Prozent = 100 : SetGadgetText (#CopyProgressText , "Orginal: " + Str(TotalFileSize)+ " Bytes     " + Str(StreamSize)+" Bytes  finished!" ) : EndIf 
  ProcedureReturn #PROGRESS_CONTINUE
EndProcedure

Procedure.b CopyFileWithProgress( ExistingFileName.s , NewFileName.s , flag.b )
;##############################################################################
  ProgressWndFlags = #PB_Window_TitleBar | #PB_Window_WindowCentered|#WS_POPUP
  If flag
    If flag = 2 : ProgressWndFlags| #PB_Window_SystemMenu | #PB_Window_SizeGadget : EndIf
    If OpenWindow(#ProgressWnd, 216, 0, 320, 80, ProgressWndFlags  , " Filecopy Progress ") 
      If CreateGadgetList(WindowID()) 
        ProgressBar = ProgressBarGadget(#CopyProgressBar , 10 , 15 , 300 , 20 , 0 , 100 , #PB_ProgressBar_Smooth) 
        SendMessage_( ProgressBar , #CCM_SETBKCOLOR , 0 , $174B0E );  Hintergrundfarbe 
        SendMessage_( ProgressBar , #WM_USER + 9    , 0 , $43D629 );  Balkenfarbe
        TextGadget(#CopyProgressText , 11 , 54 , 280 , 20, "")
      EndIf 
    EndIf 
    res = CopyFileEx_( @ExistingFileName.s , @NewFileName.s , @CopyProgressCallback() , 0 , cancel , 0)
    If flag = 2
      Repeat
        event = WaitWindowEvent() 
        Select event 
          Case #PB_EventGadget 
          Case #PB_EventCloseWindow : Quit = 1
        EndSelect  
      Until Quit = 1
    EndIf
    CloseWindow(#ProgressWnd)
    ProcedureReturn res
  Else
    ProcedureReturn CopyFileEx_( @ExistingFileName.s , @NewFileName.s , 0 , 0 , 0 , 0)
  EndIf
EndProcedure
  
;
; CopyFileWithProgress( CopyFrom.s , CopyTo.s , flags.b)      
;
; Pfade müssen angepasst werden
; Flags: 0 = Unsichtbar - Kein Fenster geht auf, Copy im Hintergrund.
;        1 = Fenster geht auf und schließt sich automatisch nach Beendigung.
;        2 = Fenster bleibt offen stehen und muss vom Benutzer geschlossen werden.


CopyReady = CopyFileWithProgress( "c:\test2.avi" , "d:\test2.bak" , 1)

Robert
Beiträge: 25
Registriert: 14.09.2004 23:24

Beitrag von Robert »

@isidoro

hab da noch nen Nachtrag, da ich mich auch schon mal mit der Routine rumschlagen mußte. Wegen den ULongs: man muß alle Parameter angeben und zusätzlich noch 4 Pseudo Longs, also so:

Code: Alles auswählen

Procedure.l CopyProgressCallback(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred, dwStreamNumber.l, dwCallbackReason.l, hSourceFile.l, hDestinationFile.l, lpData.l, dummy1.l, dummy2.l, dummy3.l, dummy4.l)
Ansonsten crashed die Routine, wenn man eine Datei mit 0 Byte kopieren möchte. Auch bei irgendeiner ominösen thumbs.db - Datei mit 6k gab's bei mir mal nen Absturz.

Interessant wäre noch zu wissen, wie man den % - Fortschritt mit SendMessage_ mittig in den Balken bekommt, auch mit wechselnder Textfarbe beim Balkenfortschritt.
Robert
Benutzeravatar
isidoro
Beiträge: 3
Registriert: 20.09.2004 10:13
Wohnort: Köln
Kontaktdaten:

Beitrag von isidoro »

Ja genau, quälerei mit den Ulongs, hab ich auch schon mir rumgeschlagen mit dem 0 Byte problem. Es scheint auch irgendeine möglichkeit zu geben mit einer Zahlenumbauroutiene, die dann einen Ulong bastelt... Werd mal testen ob es geht...
Nichts ist wie es scheint ...
Antworten