Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0114: Asynchrone Datei- und Ordneroperationen

 von 

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Dateien und Laufwerke

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
Multi-Threading, Dateisystem

Der Vorschlag wurde erstellt am: 27.09.2007 15:36.
Die letzte Aktualisierung erfolgte am 15.06.2008 16:19.

Zurück zur Übersicht

Beschreibung  

.NET bietet in dem Objekt My.Computer.FileSystem zahlreiche Optionen zum Kopieren, Verschieben und Löschen von Dateien und Ordner. Leider sind das häufig zeitaufwändige Operationen, die aufgrund ihres synchrone Aufruf das eigene Programm blockieren.

Dies war der Anstoß eine Klasse zu erstellen, die solche Aufträge entgegennimmt und asynchron verarbeitet, während das das Hauptprogramm weiter auf Eingaben reagieren kann. Natürlich gibt es eine Abbruchmöglichkeit und ein passendes Wait-Handle.

Seit dem Update (28.9.2007):
- Der Auftrag wird in einer eigenen Structure gespeichert.
(Source - Destination - Dir/File - Copy/Move/Delete)
- Die Autragsverwaltung erfolgt ähnlich einer Liste.
(Add/AddRange - Insert/InsertRange - Clear - Contains - Remove/RemoveAt - Count - IndexOf - Item)

Seit dem Update (30.9.2007):
- Ein Auftrag kann auch mit einem ReadOnly-Wrapper belegt werden, so dass eine spätere Veränderung unmöglich ist.
- Zahlreiche Methoden zum direkten erstellen eines Auftrags über Create-Methoden in der Structure.
- Über eine Eigenschaft kann der aktuelle Auftrag abgerufen werden. Veränderungen sind aus Sicherheitsgründen ausgeschlossen.
- Die Klasse sorgt für die entsprechenden Invoke-Aufrufe der Ereigniss, sofern dem Konstruktor das Formular übergeben wird.

Dieser Sourcecode stammt ausschließlich vom Autor. Als Grundlage für den Aufruf mittels Delegaten wurde jedoch ein Beispiel aus der MSDN verwendet. (Stichwort: Asynchrones Aufrufen von synchronen Methoden.)

Schwierigkeitsgrad

Schwierigkeitsgrad 3

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [21,14 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' ------------ Anfang Projektdatei FSQueue.vbproj ------------
' ------------ Anfang Datei clsFileSystemQueue.vb ------------
Option Compare Text
Option Explicit On
Option Strict On

Imports System.Collections
Imports System.IO

Public Class clsFileSystemQueue

    ' ************************************************************************
    ' Die gespeicherten Kopieraufträge und deren Verwaltung
    ' ************************************************************************
    Private m_List As New List(Of FSOrder)
    Private m_ActualOrder As FSOrder

    Public ReadOnly Property ActualOrder() As FSOrder
        Get
            Return m_ActualOrder

        End Get

    End Property

    Public Sub Clear()

        SyncLock CType(m_List, Collections.ICollection).SyncRoot
            m_List.Clear()

        End SyncLock

    End Sub

    Public Function Contains(ByVal item As FSOrder) As Boolean

        SyncLock CType(m_List, Collections.ICollection).SyncRoot
            Return m_List.Contains(item)

        End SyncLock

    End Function

    Public Function Remove(ByVal item As FSOrder) As Boolean

        SyncLock CType(m_List, Collections.ICollection).SyncRoot
            Return m_List.Remove(item)

        End SyncLock

    End Function

    Public Function RemoveAt(ByVal index As Integer) As Boolean

        Try

            SyncLock CType(m_List, Collections.ICollection).SyncRoot
                m_List.RemoveAt(index)

            End SyncLock

            Return True

        Catch ex As Exception

            Return False

        End Try

    End Function

    Public ReadOnly Property Count() As Integer
        Get
            SyncLock CType(m_List, Collections.ICollection).SyncRoot
                Return m_List.Count

            End SyncLock
        End Get

    End Property

    Public Function IndexOf(ByVal item As FSOrder) As Integer

        SyncLock CType(m_List, Collections.ICollection).SyncRoot
            Return m_List.IndexOf(item)

        End SyncLock

    End Function

    Public Property Item(ByVal index As Integer) As FSOrder
        Get

            Try

                SyncLock CType(m_List, Collections.ICollection).SyncRoot
                    Return m_List.Item(index)

                End SyncLock

            Catch ex As Exception

                Return Nothing

            End Try
        End Get

        Set(ByVal value As FSOrder)

            Try

                SyncLock CType(m_List, Collections.ICollection).SyncRoot
                    m_List.Item(index) = value

                End SyncLock

            Catch ex As Exception

            End Try
        End Set

    End Property

    ' ************************************************************************
    ' Die Funktionen, die einen FileSystemOrder (Klasse) oder eine
    ' Auflistung davon entgegennimmt.
    ' ************************************************************************
    Public Function Add(ByVal item As FSOrder) As FSOrder

        If item.IsInitalized Then
            SyncLock CType(m_List, Collections.ICollection).SyncRoot
                m_List.Add(item)

            End SyncLock

            Add = item

            If Not (m_IsWorking) And Not (m_IsCanceling) Then Work()

        Else

            Add = Nothing
        End If

    End Function

    Public Function AddRange(ByVal collection _
          As Collections.Generic.IEnumerable(Of FSOrder) _
          ) As Collections.Generic.IEnumerable(Of FSOrder)

        Dim Item As FSOrder
        Dim Range As New List(Of FSOrder)

        For Each Item In collection

            If Item.IsInitalized Then
                Range.Add(Item)
            End If

        Next

        SyncLock CType(m_List, Collections.ICollection).SyncRoot
            m_List.AddRange(Range)

        End SyncLock

        AddRange = Range

        If Not (m_IsWorking) And Not (m_IsCanceling) Then Work()

    End Function

    Public Function Insert(ByVal index As Integer, _
          ByVal item As FSOrder) As FSOrder

        If item.IsInitalized Then

            Try

                SyncLock CType(m_List, Collections.ICollection).SyncRoot
                    m_List.Insert(index, item)

                End SyncLock

                Return item

            Catch ex As Exception

                Return Nothing

            End Try

        Else

            Return Nothing
        End If

    End Function

    Public Function InsertRange(ByVal index As Integer, _
          ByVal collection As Collections.Generic.IEnumerable(Of FSOrder) _
          ) As Collections.Generic.IEnumerable(Of FSOrder)

        Dim Item As FSOrder
        Dim Range As New List(Of FSOrder)

        For Each Item In collection

            If Item.IsInitalized Then
                Range.Add(Item)
            End If

        Next

        Try

            SyncLock CType(m_List, Collections.ICollection).SyncRoot
                m_List.InsertRange(index, collection)

            End SyncLock

            Return Range

        Catch ex As Exception

            Return Nothing

        End Try

    End Function

    ' ************************************************************************
    ' Die Einstellungen für das Überschreiben von vorhandenen Dateien
    ' ************************************************************************
    Private m_Overwrite As Boolean = True

    Public Property OverWrite() As Boolean
        Get
            Return m_Overwrite

        End Get

        Set(ByVal value As Boolean)
            m_Overwrite = value

        End Set

    End Property

    ' ************************************************************************
    ' Der Status
    ' ************************************************************************
    Private m_IsWorking As Boolean = False

    Public ReadOnly Property IsWorking() As Boolean
        Get
            Return m_IsWorking

        End Get

    End Property

    ' ************************************************************************
    ' Die Property für einen Abbruch
    ' ************************************************************************
    Private m_IsCanceling As Boolean = False

    Public Property IsCanceling() As Boolean
        Get
            Return m_IsCanceling

        End Get

        Set(ByVal value As Boolean)

            ' Nur wenn gearbeitet wird und ein Abbruch erwünscht ist, ausführen!
            If m_IsWorking = True And value = True Then

                ' Cancel-Flag zur Sicherheit setzten
                m_IsCanceling = True
            End If

        End Set

    End Property

    Public Sub StartCanceling(ByVal Wait As Boolean)

        ' Abbruch-Flag setzen
        IsCanceling = True

        ' Auf Wunsh warten
        If Wait = True Then Me.WaitForFinish()

    End Sub

    ' ************************************************************************
    ' Die Methode bietet ein Waithandle, um auf den Abschluss der Auträge
    ' zu warten
    ' ************************************************************************
    Public Sub WaitForFinish()

        m_Waiter.WaitOne()

    End Sub

    ' ************************************************************************
    ' Die Methoden zur Verarbeitung der Kopieraufträge und Überprüfung auf
    ' einen Abbruch bzw. Fehler.
    ' ************************************************************************
    Private m_Waiter As Threading.ManualResetEvent

    Private Sub Work()

        ' Ein Abbruchbedingungs-Test mit dem Cancel-Flag
        If m_IsCanceling = True Then

            ' Aufräumarbeiten
            FinishWork()

        Else

            ' Prüfen, ob schon gearbeit wird
            If Not (m_IsWorking) Then

                ' Arbeit beginnen
                m_IsWorking = True
                m_Waiter.Reset()
            End If

            ' Arbeit fortsetzen
            ' Prüfen, ob noch Auträge vorhanden sind
            Dim t_Count As Integer

            SyncLock CType(m_List, Collections.ICollection).SyncRoot
                t_Count = m_List.Count

            End SyncLock

            ' Wenn ja Auftrag befinnen
            If t_Count > 0 Then
                AddOrder()

            Else

                ' Aufräumarbeiten
                FinishWork()
            End If

        End If

    End Sub

    Private Sub FinishWork()

        SyncLock CType(m_List, Collections.ICollection).SyncRoot
            m_List.Clear()

        End SyncLock

        m_ActualOrder = Nothing
        m_IsCanceling = False
        m_IsWorking = False
        m_Waiter.Set()

    End Sub

    ' ************************************************************************
    ' Die Methode, die versucht einen Auftrag aus der Liste zu extrahieren
    ' und die passende Funktion asynchron aufzurufen.
    ' ************************************************************************
    Private Sub AddOrder()

        Try

            Dim t_Result As IAsyncResult
            Dim t_Worker As ASyncCall

            ' Neuen Autrag holen und Property Setzen
            SyncLock CType(m_List, Collections.ICollection).SyncRoot
                m_ActualOrder = New FSOrder(m_List.Item(0), True)
                m_List.RemoveAt(0)

            End SyncLock

            ' Auftragstyp auswerten und Delegaten erzeugen
            Select Case m_ActualOrder.OrderType

                Case FSOrder.TypeOfOrder.Copy
                    t_Worker = New ASyncCall(AddressOf Copy)

                Case FSOrder.TypeOfOrder.Move
                    t_Worker = New ASyncCall(AddressOf Move)

                Case FSOrder.TypeOfOrder.Delete
                    t_Worker = New ASyncCall(AddressOf Delete)

                Case Else
                    t_Worker = Nothing

            End Select

            ' Ereigniss aufrufen
            Dim t_Status As FSOrder.OrderResultType

            ' Invoking erforderlich?
            If (Not IsNothing(m_frm)) AndAlso m_frm.InvokeRequired Then
                ' Delegat und Argument weitergeben
                m_frm.Invoke(New CallEventStart(AddressOf CallEventStartingOrder), _
                    m_ActualOrder, t_Status)

            Else                                                  ' sonst

                ' Delegat direkt ausführen
                RaiseEvent StartingOrder(m_ActualOrder, t_Status)
            End If

            ' Asynchron Aufrufen
            t_Result = t_Worker.BeginInvoke(t_Status, AddressOf Callback, t_Worker)

        Catch ex As Exception

            ' Fehler!
            m_IsCanceling = True

        End Try

    End Sub

    Private Sub Callback(ByVal ar As IAsyncResult)

        Dim t_Worker As ASyncCall = CType(ar.AsyncState, ASyncCall)

        ' Ergebniss abrufen
        Dim t_Result As FSOrder.OrderResultType = t_Worker.EndInvoke(ar)

        ' Ereignis auflösen
        ' Invoking erforderlich?
        If (Not IsNothing(m_frm)) AndAlso m_frm.InvokeRequired Then
            ' Delegat und Argument weitergeben
            m_frm.Invoke(New CallEventFinished(AddressOf CallEventFinishedOrder), _
                m_ActualOrder, t_Result)

        Else                                                  ' sonst

            ' Delegat direkt ausführen
            RaiseEvent FinishedOrder(m_ActualOrder, t_Result)
        End If

        ' Fortfahren
        Work()

    End Sub

    ' ************************************************************************
    ' Die Ereignisse, die vor und nach dem Bearbeiten einer Datei bzw.
    ' eines Ordners auftreten. Hier kann der Vorgang eventuelle abgebrochen
    ' bzw. das Ergebniss abegrufen werden. Außerdem die Delegaten und eine
    ' Funktion, die das Ereignis aufruft.
    ' ************************************************************************
    Public Event StartingOrder(ByVal Item As FSOrder, ByRef Cancel As FSOrder.OrderResultType)

    Public Delegate Sub CallEventStart(ByVal Item As FSOrder, ByRef e As FSOrder.OrderResultType)

    Private Sub CallEventStartingOrder(ByVal Item As FSOrder, _
          ByRef Cancel As FSOrder.OrderResultType)

        RaiseEvent StartingOrder(Item, Cancel)

    End Sub

    Public Event FinishedOrder(ByVal Item As FSOrder, ByVal Result As FSOrder.OrderResultType)

    Public Delegate Sub CallEventFinished(ByVal Item As FSOrder, ByVal e As FSOrder.OrderResultType)

    Private Sub CallEventFinishedOrder(ByVal Item As FSOrder, _
          ByVal Result As FSOrder.OrderResultType)

        RaiseEvent FinishedOrder(Item, Result)

    End Sub

    ' ************************************************************************
    ' Der Delegate
    ' ************************************************************************
    Private Delegate Function ASyncCall(ByVal Status As FSOrder.OrderResultType) As _
        FSOrder.OrderResultType

    ' ************************************************************************
    ' Die Funktion für den eigentlichen Kopiervorgang
    ' ************************************************************************
    Private Function Copy(ByVal Status As FSOrder.OrderResultType) As FSOrder.OrderResultType

        Try

            If Status = FSOrder.OrderResultType.Success Then

                Select Case m_ActualOrder.FileSystemType

                    Case FSOrder.TypeOfFileSystem.Dir

                        My.Computer.FileSystem.CopyDirectory(m_ActualOrder.Source, _
                            m_ActualOrder.Destination, m_Overwrite)

                    Case FSOrder.TypeOfFileSystem.File

                        My.Computer.FileSystem.CopyFile(m_ActualOrder.Source, _
                            m_ActualOrder.Destination, m_Overwrite)

                End Select

            End If

        Catch ex As Exception

            Status = FSOrder.OrderResultType.Error

        End Try

        Return Status

    End Function

    ' ************************************************************************
    ' Die Funktion für den eigentlichen Verschiebevorgang
    ' ************************************************************************
    Private Function Move(ByVal Status As FSOrder.OrderResultType) As FSOrder.OrderResultType

        Try

            If Status = FSOrder.OrderResultType.Success Then

                Select Case m_ActualOrder.FileSystemType

                    Case FSOrder.TypeOfFileSystem.Dir

                        My.Computer.FileSystem.MoveDirectory(m_ActualOrder.Source, _
                            m_ActualOrder.Destination, m_Overwrite)

                    Case FSOrder.TypeOfFileSystem.File

                        My.Computer.FileSystem.MoveFile(m_ActualOrder.Source, _
                            m_ActualOrder.Destination, m_Overwrite)

                End Select

            End If

        Catch ex As Exception

            Status = FSOrder.OrderResultType.Error

        End Try

        Return Status

    End Function

    ' ************************************************************************
    ' Die Funktion für den eigentlichen Löschvorgang
    ' ************************************************************************
    Private Function Delete(ByVal Status As FSOrder.OrderResultType) As FSOrder.OrderResultType

        Try

            If Status = FSOrder.OrderResultType.Success Then

                Select Case m_ActualOrder.FileSystemType

                    Case FSOrder.TypeOfFileSystem.Dir

                        My.Computer.FileSystem.DeleteDirectory(m_ActualOrder.Source, _
                            FileIO.UIOption.OnlyErrorDialogs, _
                            FileIO.RecycleOption.SendToRecycleBin)

                    Case FSOrder.TypeOfFileSystem.File

                        My.Computer.FileSystem.DeleteFile(m_ActualOrder.Source, _
                            FileIO.UIOption.OnlyErrorDialogs, _
                            FileIO.RecycleOption.SendToRecycleBin)

                End Select

            End If

        Catch ex As Exception

            Status = FSOrder.OrderResultType.Error

        End Try

        Return Status

    End Function

    Private m_frm As Windows.Forms.Form

    Public Sub New(ByVal frm As Windows.Forms.Form)

        m_frm = frm
        m_Waiter = New Threading.ManualResetEvent(True)

    End Sub

End Class

' ------------- Ende Datei clsFileSystemQueue.vb -------------
' ----------------- Anfang Datei FSOrder.vb  -----------------
Public Structure FSOrder

    ' ************************************************************************
    ' Die Funktionen, die einen Kopierauftrag einer Datei bzw. eines Ordners
    ' auftreten entgegennehmen.
    ' ************************************************************************
    Public Shared Function CreateDirForCopy(ByVal Source As String, ByVal Destination As _
        String) As FSOrder

        Dim Item As New FSOrder(Source, Destination, FSOrder.TypeOfOrder.Copy, _
            FSOrder.TypeOfFileSystem.Dir)

        Return Item

    End Function

    Public Shared Function CreateFileForCopy(ByVal Source As String, ByVal Destination As _
        String) As FSOrder

        Dim Item As New FSOrder(Source, Destination, FSOrder.TypeOfOrder.Copy, _
            FSOrder.TypeOfFileSystem.File)

        Return Item

    End Function

    ' ************************************************************************
    ' Die Funktionen, die einen Verschiebeauftrag einer Datei bzw. eines
    ' Ordners auftreten entgegennehmen.
    ' ************************************************************************
    Public Shared Function CreateDirForMove(ByVal Source As String, ByVal Destination As _
        String) As FSOrder

        Dim Item As New FSOrder(Source, Destination, FSOrder.TypeOfOrder.Move, _
            FSOrder.TypeOfFileSystem.Dir)

        Return Item

    End Function

    Public Shared Function CreateFileForMove(ByVal Source As String, ByVal Destination As _
        String) As FSOrder

        Dim Item As New FSOrder(Source, Destination, FSOrder.TypeOfOrder.Move, _
            FSOrder.TypeOfFileSystem.File)

        Return Item

    End Function

    ' ************************************************************************
    ' Die Funktionen, die einen Löschauftrag einer Datei bzw. eines Ordners
    ' auftreten entgegennehmen.
    ' ************************************************************************
    Public Shared Function CreateDirForDelete(ByVal Source As String) As FSOrder

        Dim Item As New FSOrder(Source, "", FSOrder.TypeOfOrder.Delete, _
            FSOrder.TypeOfFileSystem.Dir)

        Return Item

    End Function

    Public Shared Function CreateFileForDelete(ByVal Source As String) As FSOrder

        Dim Item As New FSOrder(Source, "", FSOrder.TypeOfOrder.Delete, _
            FSOrder.TypeOfFileSystem.File)

        Return Item

    End Function

    ' ************************************************************************
    ' Die Eigenschaften
    ' ************************************************************************
    Private m_Source As String

    Public Property Source() As String
        Get
            Return m_Source

        End Get

        Set(ByVal value As String)

            ' Prüft den Read/Write-Wrapper
            If Not (m_ReadOnlyWrapper) Then
                m_Source = value

            Else

                Throw New NotSupportedException
            End If

        End Set

    End Property

    Private m_Destination As String

    Public Property Destination() As String
        Get
            Return m_Destination

        End Get

        Set(ByVal value As String)

            ' Prüft den Read/Write-Wrapper
            If Not (m_ReadOnlyWrapper) Then

                ' Bei Delete ist diese Property unwichtig!
                If m_OrderType = TypeOfOrder.Delete Then

                    Exit Property

                Else

                    m_Destination = value
                End If

            Else

                Throw New NotSupportedException
            End If

        End Set

    End Property

    Public Enum TypeOfOrder
        Copy = 1
        Move = 2
        Delete = 3
    End Enum

    Private m_OrderType As TypeOfOrder

    Public Property OrderType() As TypeOfOrder
        Get
            Return m_OrderType

        End Get

        Set(ByVal value As TypeOfOrder)

            ' Prüft den Read/Write-Wrapper
            If Not (m_ReadOnlyWrapper) Then
                m_OrderType = value

                If value = TypeOfOrder.Delete Then

                    ' Bei Delete ist diese Property unwichtig!
                    m_Destination = ""
                End If

            Else

                Throw New NotSupportedException
            End If

        End Set

    End Property

    Public Enum TypeOfFileSystem
        Dir = 1
        File = 2
    End Enum

    Private m_FileSystemType As TypeOfFileSystem

    Public Property FileSystemType() As TypeOfFileSystem
        Get
            Return m_FileSystemType

        End Get

        Set(ByVal value As TypeOfFileSystem)

            ' Prüft den Read/Write-Wrapper
            If Not (m_ReadOnlyWrapper) Then
                m_FileSystemType = value

            Else

                Throw New NotSupportedException
            End If

        End Set

    End Property

    Public ReadOnly Property IsInitalized() As Boolean
        Get

            Dim Result(1) As Boolean

            Select Case m_FileSystemType

                    ' Überprüft, ob die Quelle existiert
                Case TypeOfFileSystem.Dir
                    Result(0) = IO.Directory.Exists(m_Source)

                Case TypeOfFileSystem.File
                    Result(0) = IO.File.Exists(m_Source)

            End Select

            If m_OrderType <> TypeOfOrder.Delete Then

                Select Case m_FileSystemType

                        ' Überprüft, ob das Ziel existiert
                    Case TypeOfFileSystem.Dir
                        Result(1) = IO.Directory.Exists(m_Destination)

                    Case TypeOfFileSystem.File
                        Result(1) = IO.File.Exists(m_Destination)

                End Select

                If Not (Result(1)) Then

                    Try

                        Select Case m_FileSystemType

                                ' Überprüft, ob sich das Element erstellen lässt
                                ' wenn es noch nicht existiert
                            Case TypeOfFileSystem.Dir

                                Call IO.Directory.CreateDirectory(m_Destination)

                                Result(1) = IO.Directory.Exists(m_Destination)

                            Case TypeOfFileSystem.File

                                Call IO.Directory.CreateDirectory(IO.Path.GetDirectoryName( _
                                    m_Destination))

                                Call IO.File.Create(m_Destination).Close()

                                Result(1) = IO.File.Exists(m_Destination)

                        End Select

                    Catch ex As Exception

                    End Try
                End If

            Else

                ' Bei Delete ist Destination unwichtig!
                Result(1) = True
            End If

            Return Result(0) And Result(1)

        End Get

    End Property

    Public Enum OrderResultType
        Success = 0
        [Error] = 1
        Canceled = -1
    End Enum

    Private m_ReadOnlyWrapper As Boolean

    Public Property ReadOnlyWrapper() As Boolean
        Get
            Return m_ReadOnlyWrapper

        End Get

        Private Set(ByVal value As Boolean)

            m_ReadOnlyWrapper = value

        End Set

    End Property

    Public Sub New(ByVal Source As String, ByVal Destination As String, _
          ByVal OrderType As TypeOfOrder, ByVal FileSystemType As TypeOfFileSystem, _
          Optional ByVal ReadOnlyWrapper As Boolean = False)

        Me.OrderType = OrderType
        Me.FileSystemType = FileSystemType
        Me.Source = Source
        Me.Destination = Destination
        Me.ReadOnlyWrapper = ReadOnlyWrapper

    End Sub

    Public Sub New(ByVal OrderType As TypeOfOrder, _
          ByVal FileSystemType As TypeOfFileSystem, _
          Optional ByVal ReadOnlyWrapper As Boolean = False)

        Me.OrderType = OrderType
        Me.FileSystemType = FileSystemType
        Me.Source = ""
        Me.Destination = ""
        Me.ReadOnlyWrapper = ReadOnlyWrapper

    End Sub

    Public Sub New(ByVal Order As FSOrder, ByVal ReadOnlyWrapper As Boolean)

        Me.OrderType = Order.OrderType
        Me.FileSystemType = Order.FileSystemType
        Me.Source = Order.Source
        Me.Destination = Order.Destination
        Me.ReadOnlyWrapper = ReadOnlyWrapper

    End Sub

End Structure

' ------------------ Ende Datei FSOrder.vb  ------------------
' ----------------- Anfang Datei Testing.vb  -----------------
Public Class Testing

    Private WithEvents X As New clsFileSystemQueue(Me)

    Private Sub Start(ByVal Item As FSOrder, _
          ByRef Cancel As FSOrder.OrderResultType) Handles X.StartingOrder

        Console.WriteLine("Start")

        If Item.FileSystemType = FSOrder.TypeOfFileSystem.File Then

            ' Dateioperation
            Select Case Item.OrderType

                Case FSOrder.TypeOfOrder.Copy

                    lblOrder.Text = "Start des Kopierens (Datei) von " & Item.Source & " " & _
                        "nach " & Item.Destination

                Case FSOrder.TypeOfOrder.Delete
                    lblOrder.Text = "Start des Löschens (Datei) von " & Item.Source

                Case FSOrder.TypeOfOrder.Move

                    lblOrder.Text = "Start des Verschiebens (Datei) von " & Item.Source & _
                        " nach " & Item.Destination

            End Select

        Else

            ' Ordneroperation
            Select Case Item.OrderType

                Case FSOrder.TypeOfOrder.Copy

                    lblOrder.Text = "Start des Kopierens (Ordner) von " & Item.Source & " " & _
                        "nach " & Item.Destination

                Case FSOrder.TypeOfOrder.Delete
                    lblOrder.Text = "Start des Löschens (Ordner) von " & Item.Source

                Case FSOrder.TypeOfOrder.Move

                    lblOrder.Text = "Start des Verschiebens (Ordner) von " & Item.Source & _
                        " nach " & Item.Destination

            End Select

        End If

        ' Bei gewünschtem Abbruch Cancel<>Success setzen!
    End Sub

    Private Sub Ended(ByVal Item As FSOrder, _
          ByVal Result As FSOrder.OrderResultType) Handles X.FinishedOrder

        If Item.FileSystemType = FSOrder.TypeOfFileSystem.File Then

            ' Dateioperation
            Select Case Item.OrderType

                Case FSOrder.TypeOfOrder.Copy
                    lblResult.Text = "Ergebniss des Kopierens (Datei): " & Result.ToString

                Case FSOrder.TypeOfOrder.Delete
                    lblResult.Text = "Ergebniss des Löschens (Datei): " & Result.ToString

                Case FSOrder.TypeOfOrder.Move
                    lblResult.Text = "Ergebniss des Verschiebens (Datei): " & Result.ToString

            End Select

        Else

            ' Ordneroperation
            Select Case Item.OrderType

                Case FSOrder.TypeOfOrder.Copy
                    lblResult.Text = "Ergebniss des Kopierens (Ordner): " & Result.ToString

                Case FSOrder.TypeOfOrder.Delete
                    lblResult.Text = "Ergebniss des Löschens (Ordner): " & Result.ToString

                Case FSOrder.TypeOfOrder.Move
                    lblResult.Text = "Ergebniss des Verschiebens (Ordner): " & Result.ToString

            End Select

        End If

        If X.Count = 0 Then
            lblOrder.Text = ""
        End If

    End Sub

    Private Sub cmdCopyDir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles cmdCopyDir.Click

        X.Add(FSOrder.CreateDirForCopy("F:\VS\VisualStudio\Setup", "H:\C\Setup"))
        X.Add(FSOrder.CreateDirForCopy("F:\VS\VisualStudio\Windows", "H:\C\Windows"))

    End Sub

    Private Sub cmdCopyFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles cmdCopyFile.Click

        X.Add(FSOrder.CreateFileForCopy("F:\VS\VisualStudio\locdata.ini", "H:\C\fi\locdata.ini"))
        X.Add(FSOrder.CreateFileForCopy("F:\VS\VisualStudio\vs_setup.msi", "H:\C\fi\vs_setup.msi"))

    End Sub

    Private Sub cmdMove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles cmdMove.Click

        X.Add(FSOrder.CreateDirForMove("H:\C\Setup", "F:\A\Setup"))
        X.Add(FSOrder.CreateFileForMove("H:\C\fi\vs_setup.msi", "F:\A\vs_setup.msi"))

    End Sub

    Private Sub cmdDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles cmdDelete.Click

        X.Add(FSOrder.CreateDirForDelete("F:\A"))

        Dim item As FSOrder = New FSOrder("H:\C\fi\locdata.ini", "", _
            FSOrder.TypeOfOrder.Delete, FSOrder.TypeOfFileSystem.File)

        X.Insert(0, item)
        X.Add(FSOrder.CreateDirForDelete("H:\C\Windows"))

    End Sub

    Private Sub cmdCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles cmdCancel.Click

        If X.IsWorking Then
            MsgBox("Starte Abbruch ...", MsgBoxStyle.Information)
            X.StartCanceling(True)
            MsgBox("Abbruch fertig!", MsgBoxStyle.Information)
        End If

    End Sub

    Private Sub Testing_FormClosing(ByVal sender As Object, ByVal e As _
        System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

        If X.IsWorking Then
            MsgBox("Warte auf Ende ...", MsgBoxStyle.Information)
            X.StartCanceling(True)
        End If

    End Sub

End Class

' ------------------ Ende Datei Testing.vb  ------------------
' ------------- Ende Projektdatei FSQueue.vbproj -------------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.
Folgende Diskussionen existieren bereits

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.