Hier mal ein Beispiel für asynchrones Löschen mit ProgressBar.
Imports System.ComponentModel
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Dim dir As New IO.DirectoryInfo("d:/ein/ordner")
Dim files() As IO.FileInfo = dir.GetFiles("*.*", _
IO.SearchOption.AllDirectories)
StartDeleting(files)
End Sub
'gesamte größe aller files
Private Function EntireSizeInKiloBytes(ByVal files() As IO.FileInfo) As _
Double
Dim size As Double = 0
For Each file As IO.FileInfo In files
size += file.Length / 1024
Next
Return size
End Function
Private Sub StartDeleting(ByVal files() As IO.FileInfo)
ProgressBar1.Maximum = CInt(EntireSizeInKiloBytes(files))
ProgressBar1.Minimum = 0
ProgressBar1.Value = 0
'bgw deklarieren, events setzen und starten
Dim bgw As New BackgroundWorker
AddHandler bgw.DoWork, AddressOf bgw_DoWork
AddHandler bgw.ProgressChanged, AddressOf bgw_ProgressChanged
AddHandler bgw.RunWorkerCompleted, AddressOf bgw_RunWorkerCompleted
bgw.WorkerReportsProgress = True
bgw.WorkerSupportsCancellation = True
bgw.RunWorkerAsync(files) 'die files als user argument übergeben
End Sub
Private Sub bgw_DoWork(ByVal sender As System.Object, ByVal e As _
System.ComponentModel.DoWorkEventArgs)
Dim bgw As BackgroundWorker = CType(sender, BackgroundWorker)
'die files aus dem user argument holen
Dim files() As IO.FileInfo = TryCast(e.Argument, IO.FileInfo())
If files IsNot Nothing Then
Dim entireSize As Double = EntireSizeInKiloBytes(files)
Dim deletedSize As Double = 0
For Each file As IO.FileInfo In files
If bgw.CancellationPending Then
' wenn abgebrochen werden soll; bgw müsste dann aber wieder
' global definiert werden oder sonstwo zwichengespeichert
' werden um darauf zuzugreifen
Exit For
Else
'file.Delete()
Threading.Thread.Sleep(CInt(file.Length / 1024 / 8)) _
'anstatt ich meine files lösche ;-)
deletedSize += file.Length / 1024
bgw.ReportProgress(CInt(deletedSize))
End If
Next
Debug.WriteLine(entireSize - deletedSize)
End If
End Sub
Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As _
System.ComponentModel.ProgressChangedEventArgs)
'durch umwandlung in Integer (in DoWork) kann eine aufrundung das
' maximum am ende (wahrscheinlich letzte file) übersteigen, muss aber
' nicht sein
If e.ProgressPercentage <= ProgressBar1.Maximum Then : _
ProgressBar1.Value = e.ProgressPercentage
Else : ProgressBar1.Value = ProgressBar1.Maximum
End If
End Sub
Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As _
System.ComponentModel.RunWorkerCompletedEventArgs)
'jetzt nur noch die events entfernen
Dim bgw As BackgroundWorker = CType(sender, BackgroundWorker)
RemoveHandler bgw.DoWork, AddressOf bgw_DoWork
RemoveHandler bgw.ProgressChanged, AddressOf bgw_ProgressChanged
RemoveHandler bgw.RunWorkerCompleted, AddressOf bgw_RunWorkerCompleted
ProgressBar1.Value = 0
MsgBox("habe fertig")
End Sub Maas
Beitrag wurde zuletzt am 12.01.10 um 15:53:27 editiert. |