Hallo,
hier ein Beispielcode unter verwendung des Backgroundworkers und den
Apis.
Dieses Beispiel soll zeigen, wie unter Verwendung des Backgroundworkers auf die Windows Form zugegriffen werden kann.
Natürlich 'hängt' bei großen Mengen auch diese Windows Form !!!
Was ein etwas anderes Vorgehen erfordern würde.
Komentare erwünscht.
Gruss
mikeb69
hier ein Beispielcode unter verwendung des Backgroundworkers und den
Apis.
Dieses Beispiel soll zeigen, wie unter Verwendung des Backgroundworkers auf die Windows Form zugegriffen werden kann.
Natürlich 'hängt' bei großen Mengen auch diese Windows Form !!!
Was ein etwas anderes Vorgehen erfordern würde.
VB.NET-Quellcode
- Imports System
- Imports System.IO
- Imports System.Runtime
- Imports System.Runtime.InteropServices
- Imports System.ComponentModel
- Public Class Form1
- Private Declare Auto Function FindFirstFile Lib "kernel32.dll" (ByVal lpFileName As String, _
- ByRef lpFindData As WIN32_FIND_DATA) As IntPtr
- Private Declare Auto Function FindNextFile Lib "kernel32.dll" (ByVal hFindFile As IntPtr, _
- ByRef lpFindData As WIN32_FIND_DATA) As Boolean
- Private Declare Function FindClose Lib "kernel32.dll" (ByVal hFindFile As IntPtr) As Boolean
- <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
- Private Structure WIN32_FIND_DATA
- Public sfileAttributes As Int32
- Public creationTime_lowDateTime As Int32
- Public creationTime_highDateTime As Int32
- Public lastAccessTime_lowDateTime As Int32
- Public lastAccessTime_highDateTime As Int32
- Public lastWriteTime_lowDateTime As Int32
- Public lastWriteTime_highDateTime As Int32
- Public nFileSizeHigh As Int32
- Public nFileSizeLow As Int32
- Public dwReserved0 As Int32
- Public dwReserved1 As Int32
- <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAX_PATH)> _
- Public fileName As String
- <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=14)> _
- Public alternateFileName As String
- End Structure
- Private Const MAX_PATH As Integer = 260
- Private Const INVALID_HANDLE_VALUE As Integer = -1
- Private Const FILE_ATTRIBUTE_DIRECTORY As Integer = &H10
- Private WithEvents bgw As New BackgroundWorker
- #Region "Windows Forms Events"
- Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- 'backgroundworker abbrechen, falls dieser noch beschäftigt ist
- If bgw.IsBusy = True Then
- bgw.CancelAsync()
- End If
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- 'nötige backgroundworker einstellungen vornehmen
- bgw.WorkerReportsProgress = True
- bgw.WorkerSupportsCancellation = True
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- 'hier ein array definieren, dass das startverzeichnis und das suchmuster enthält
- Dim arg() As String = {"c:\", "*.*"}
- bgw.RunWorkerAsync(arg)
- End Sub
- #End Region
- #Region "Backgroundworker"
- ''' <summary>Rekursives durchsuchen aller Ordner unterhalb des Startordners.</summary>
- ''' <param name="folder">Aktueller Ordner der durchsucht wird.</param>
- ''' <param name="pattern">Suchmuster z.b. *.*</param>
- ''' <remarks></remarks>
- Private Sub FindAllFiles(ByVal folder As String, ByVal pattern As String)
- Dim w32data As New WIN32_FIND_DATA
- Dim Handle As Integer = FindFirstFile(Path.Combine(folder, "*.*"), w32data)
- If Handle <> INVALID_HANDLE_VALUE Then
- Dim Search As Boolean = True
- Do
- 'Handelt es sich um ein Verzeichnis?
- If (w32data.sfileAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
- 'Verzeichnisnamen ermitteln und für den späteren rekursiven Aufruf speichern
- If w32data.fileName <> "." And w32data.fileName <> ".." Then
- FindAllFiles(Path.Combine(folder, w32data.fileName), pattern)
- End If
- Else
- 'es ist eine datei
- If w32data.fileName Like pattern Then
- 'hier wurde eine datei als passend erkannt.
- 'aktionen wie z.b. kopieren usw. können hier angestossen werden
- 'soll auf die form zugegriffen werden, muss das im reportprogress event stattfinden
- bgw.ReportProgress(0, Path.Combine(folder, w32data.fileName))
- End If
- End If
- Loop Until FindNextFile(Handle, w32data) = False
- 'handle schliessen
- FindClose(Handle)
- End If
- End Sub
- Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
- 'übergebene argumente zerpflücken und an bgw übergeben
- Dim arg() As String = e.Argument
- 'suche durch 1.aufruf der rekursiven funktion beginnen
- FindAllFiles(arg(0), arg(1))
- End Sub
- Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
- 'hier kann dann auf die windows-form zugegriffen werden
- Me.ListBox1.Items.Add(e.UserState)
- End Sub
- #End Region
- End Class
Komentare erwünscht.
Gruss
mikeb69