vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Dateisystem · Dateien allgemein   |   VB-Versionen: VB5, VB630.10.02
Copy-Funktion per API mit Fortschrittsanzeige

Eine Datei-Kopierfunktion mit Fortschrittsanzeige! Wie's geht erfahren Sie hier.

Autor:   Eduard SudnikBewertung:  Views:  49.505 
www.esu-soft.deSystem:  WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Immer wieder wird nach einer Kopierfunktion gefragt, die den Fortschritt anzeigt und einfach zu integrieren ist. Über die API - Dokumentation bin ich zufällig auf die Funktion CopyFileEx gestossen. Diese Funktion bietet genau die gesuchte Funktion: Kopieren einer Datei und Möglichkeit den Kopierfortschritt beliebig anzuzeigen.

Hierzu wird ein Modul mit folgendem Code benötigt:

Option Explicit
 
' Benötigte API-Deklarationen und Konstanten
Public Const PROGRESS_CANCEL = 1
Public Const PROGRESS_CONTINUE = 0
Public Const PROGRESS_QUIET = 3
Public Const PROGRESS_STOP = 2
Public Const COPY_FILE_FAIL_IF_EXISTS = &H1
Public Const COPY_FILE_RESTARTABLE = &H2
 
Public Declare Function CopyFileEx Lib "kernel32.dll" _
  Alias "CopyFileExA" ( _
  ByVal lpExistingFileName As String, _
  ByVal lpNewFileName As String, _
  ByVal lpProgressRoutine As Long, _
  lpData As Any, _
  ByRef pbCancel As Long, _
  ByVal dwCopyFlags As Long) As Long
 
Public bCancel As Long
 
' Verweis auf ein ProgressBar-Control
Public glbProgBar As ProgressBar

Die eigentlich Funktion:

' Datei kopieren mit Fortschrittsanzeige
Public Function Fortschrittsanzeige( _
  ByVal TotalFileSize As Currency, _
  ByVal TotalBytesTransferred As Currency, _
  ByVal StreamSize As Currency, _
  ByVal StreamBytesTransferred As Currency, _
  ByVal dwStreamNumber As Long, _
  ByVal dwCallbackReason As Long, _
  ByVal hSourceFile As Long, _
  ByVal hDestinationFile As Long, _
  ByVal lpData As Long) As Long
 
  If Not glbProgBar Is Nothing Then
    With glbProgBar
      .Value = CStr(Int((TotalBytesTransferred * 10000) / _
        (TotalFileSize * 10000) * 100))
    End With
    DoEvents
  End If
 
  Fortschrittsanzeige = PROGRESS_CONTINUE
End Function

Ein kleines Beispiel:
Platzieren Sie auf die Form1 zwei TextBoxen (txtSource und txtDest), einen CommandButton (cmdCopy), sowie das ProgressBar-Control aus der Windows Common Controls-Collection (Menü Projekt - Komponenten).

' Datei kopieren
Private Sub cmdCopy_Click()
  ' ProgressBar-Control
  Set glbProgBar = ProgressBar1
  ProgressBar1.Value = 0
 
  ' Datei kopieren
  nResult = CopyFileEx(txtSource.Text, _
    txtDest.Text, _
    AddressOf Fortschrittsanzeige, _
    ByVal 0&, _
    bCancel, _
    COPY_FILE_RESTARTABLE)
End Sub

Der Aufruf übergibt der API-Funktion die Quell- und Zieldatei. In der Funktion Fortschrittsanzeige aktualisierenwir die Progressbar. Optional wäre es noch möglich den Vorgang abzubrechen, in dem bCancel = True gesetzt wird.
 



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.