Der aufrufende Thread kann nicht auf dieses Objekt zugreifen - in Verbindung mit WPF und FileSystemWatcher

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von mpmichael.

    Der aufrufende Thread kann nicht auf dieses Objekt zugreifen - in Verbindung mit WPF und FileSystemWatcher

    Hallo und frohe Weihnachten,

    ich bin grade dabei ein Programm zu entwerfen, welches Verzeichnisse überwachen soll. Dazu habe ich eine einfache Oberfläche erstellt. Ich stoße bei der Programmausführung aber auf einen Fehler, den ich selbst mit Google nicht beheben konnte.
    Vielleicht kann hier jemand helfen. Der Fehler lautet:

    VB.NET-Quellcode

    1. Nachricht = Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet.
    2. Quelle = WindowsBase



    Hier der Quellcode:

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:FolderWatch"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="464" Width="800">
    9. <Grid Margin="0,0,0,-6">
    10. <Grid.RowDefinitions>
    11. <RowDefinition Height="229.021" />
    12. <RowDefinition />
    13. </Grid.RowDefinitions>
    14. <Grid.ColumnDefinitions>
    15. <ColumnDefinition />
    16. <ColumnDefinition Width="100" />
    17. </Grid.ColumnDefinitions>
    18. <DataGrid x:Name="DG_FolderList" Margin="10,41,10,20" SelectionMode="Single" IsReadOnly="True" CanUserAddRows="False" CanUserDeleteRows="False" FontFamily="Consolas" FontSize="10" AlternatingRowBackground="#FFE1ECE7" AlternationCount="1">
    19. </DataGrid>
    20. <Label Content="Watched Folder" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="26" Width="93" />
    21. <Button x:Name="BT_AddFolder" Grid.Column="1" Content="Add Folder" HorizontalAlignment="Center" Margin="0,41,0,0" VerticalAlignment="Top" Width="80" Height="20" FontSize="10" />
    22. <Button x:Name="BT_DelFolder" Grid.Column="1" Content="Remove Folder" HorizontalAlignment="Center" Margin="0,66,0,0" VerticalAlignment="Top" Width="80" Height="20" FontSize="10" />
    23. <Label Content="Watch Log" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="26" Width="93" Grid.Row="1" />
    24. <TextBox x:Name="TB_WatchLog" Margin="10,36,10,45" Grid.Row="1" TextWrapping="Wrap" />
    25. <Button x:Name="BT_CLRLog" Grid.Column="1" Content="ClearLog" HorizontalAlignment="Center" Margin="0,36,0,0" VerticalAlignment="Top" Width="80" Height="20" FontSize="10" Grid.Row="1" />
    26. <Button x:Name="BT_Start" Grid.Column="1" Content="Start" HorizontalAlignment="Center" Margin="0,159,0,0" VerticalAlignment="Top" Width="80" Height="20" FontSize="10" IsEnabled="False" />
    27. <Button x:Name="BT_Stop" Grid.Column="1" Content="Stop" HorizontalAlignment="Center" Margin="0,189,0,0" VerticalAlignment="Top" Width="80" Height="20" FontSize="10" IsEnabled="False" />
    28. </Grid>
    29. </Window>


    Und der VB-Code

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Ookii.Dialogs.Wpf
    3. Class MainWindow
    4. #Region "Definitions"
    5. Dim SaveFile As String = FileIO.FileSystem.CurrentDirectory & "\settings.cnf"
    6. Dim TheFolders As New List(Of FolderItems)
    7. #End Region
    8. #Region "Subs and Funcs"
    9. Private Sub Init()
    10. 'Load SaveFile
    11. LoadList()
    12. 'Fill Grid
    13. DG_FolderList.ItemsSource = TheFolders
    14. CheckButtons()
    15. End Sub
    16. Private Sub SaveList()
    17. If File.Exists(SaveFile) Then File.Delete(SaveFile)
    18. For Each LineElement In TheFolders
    19. Dim LineOut As String = LineElement.FolderPath & ";" & LineElement.FolderChDate & ";" & LineElement.FolderLastStatus
    20. File.AppendAllText(SaveFile, LineOut)
    21. Next
    22. End Sub
    23. Private Sub LoadList()
    24. Dim Tlist As New List(Of String)
    25. TheFolders.Clear()
    26. If File.Exists(SaveFile) Then
    27. Tlist.AddRange(File.ReadAllLines(SaveFile).ToArray)
    28. For Each LineElement In Tlist
    29. Dim LineParts() As String = LineElement.Split(";")
    30. Dim TFObject As New FolderItems With {
    31. .FolderPath = LineParts(0)}
    32. If LineParts.Length > 1 Then TFObject.FolderChDate = LineParts(1)
    33. If LineParts.Length > 2 Then TFObject.FolderLastStatus = LineParts(2)
    34. TFObject.FolderStatus = "stopped"
    35. TheFolders.Add(TFObject)
    36. Next
    37. DG_FolderList.Items.Refresh()
    38. End If
    39. CheckButtons()
    40. End Sub
    41. Private Sub CheckButtons()
    42. If TheFolders.Count > 0 Then
    43. BT_Start.IsEnabled = True
    44. BT_DelFolder.IsEnabled = True
    45. Else
    46. BT_Start.IsEnabled = False
    47. BT_DelFolder.IsEnabled = False
    48. End If
    49. If TB_WatchLog.Text = "" Then
    50. BT_CLRLog.IsEnabled = False
    51. Else
    52. BT_CLRLog.IsEnabled = True
    53. End If
    54. End Sub
    55. Private Sub UpdFolderChg(ChgFile As String, ChgType As String)
    56. Dim FolderPath As String = ChgFile.Substring(0, ChgFile.LastIndexOf("\"))
    57. If Not FolderPath = "" Then
    58. Dim Idx As Integer = TheFolders.FindIndex(Function(x) x.FolderPath.Equals(FolderPath))
    59. If Not Idx = -1 Then
    60. TheFolders(Idx).FolderChDate = Now
    61. TheFolders(Idx).FolderLastStatus = ChgType
    62. End If
    63. FillBoxSub(Now & " " & ChgType & " : " & ChgFile & vbLf)
    64. End If
    65. End Sub
    66. Private Sub FillBoxSub(NewText As String)
    67. Dim MsgText As String = NewText & TB_WatchLog.Text
    68. TB_WatchLog.Text = MsgText
    69. End Sub
    70. Private Sub AddWatch(FolderItem As FolderItems)
    71. Try
    72. If Directory.Exists(FolderItem.FolderPath) Then
    73. Dim FWatch As New FileSystemWatcher With {
    74. .Path = FolderItem.FolderPath,
    75. .Filter = "",
    76. .EnableRaisingEvents = True,
    77. .IncludeSubdirectories = False,
    78. .NotifyFilter = NotifyFilters.Attributes Or
    79. NotifyFilters.CreationTime Or
    80. NotifyFilters.DirectoryName Or
    81. NotifyFilters.FileName Or
    82. NotifyFilters.LastAccess Or
    83. NotifyFilters.LastWrite Or
    84. NotifyFilters.Security Or
    85. NotifyFilters.Size
    86. }
    87. AddHandler FWatch.Created, AddressOf FSWNotify
    88. AddHandler FWatch.Deleted, AddressOf FSWNotify
    89. AddHandler FWatch.Changed, AddressOf FSWNotify
    90. AddHandler FWatch.Error, AddressOf FSWOnError
    91. End If
    92. FolderItem.FolderStatus = "watching"
    93. Catch ex As Exception
    94. ShowError(ex)
    95. End Try
    96. End Sub
    97. Private Sub FSWNotify(sender As Object, e As FileSystemEventArgs)
    98. UpdFolderChg(e.FullPath, e.ChangeType.ToString)
    99. End Sub
    100. Private Sub FSWOnError(sender As Object, e As ErrorEventArgs)
    101. Dim ex As Exception = e.GetException()
    102. ShowError(ex)
    103. CheckButtons()
    104. End Sub
    105. Private Sub ShowError(ex As Exception)
    106. Dim Dlg As New TaskDialog With {
    107. .Content = ex.Message & vbLf & ex.StackTrace,
    108. .WindowTitle = "Exception occured"}
    109. Dlg.ShowDialog()
    110. End Sub
    111. #End Region
    112. #Region "Main"
    113. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    114. Init()
    115. End Sub
    116. #End Region
    117. #Region "Buttons"
    118. Private Sub BT_AddFolder_Click(sender As Object, e As RoutedEventArgs) Handles BT_AddFolder.Click
    119. Dim OFD As New VistaFolderBrowserDialog
    120. OFD.Description = "Verzeichnis auswählen"
    121. If OFD.ShowDialog Then
    122. Dim TItem As New FolderItems With {.FolderPath = OFD.SelectedPath, .FolderChDate = Now, .FolderStatus = "stopped", .FolderLastStatus = "nope"}
    123. TheFolders.Add(TItem)
    124. DG_FolderList.Items.Refresh()
    125. End If
    126. SaveList()
    127. CheckButtons()
    128. End Sub
    129. Private Sub BT_DelFolder_Click(sender As Object, e As RoutedEventArgs) Handles BT_DelFolder.Click
    130. If Not DG_FolderList.SelectedIndex = -1 Then
    131. TheFolders.RemoveAt(DG_FolderList.SelectedIndex)
    132. DG_FolderList.Items.Refresh()
    133. End If
    134. SaveList()
    135. CheckButtons()
    136. End Sub
    137. Private Sub BT_CLRLog_Click(sender As Object, e As RoutedEventArgs) Handles BT_CLRLog.Click
    138. TB_WatchLog.Text = ""
    139. CheckButtons()
    140. End Sub
    141. Private Sub BT_Start_Click(sender As Object, e As RoutedEventArgs) Handles BT_Start.Click
    142. For Each MemItem As FolderItems In TheFolders
    143. AddWatch(MemItem)
    144. Next
    145. DG_FolderList.Items.Refresh()
    146. End Sub
    147. Private Sub BT_Stop_Click(sender As Object, e As RoutedEventArgs) Handles BT_Stop.Click
    148. End Sub
    149. #End Region
    150. End Class
    151. Public Class FolderItems
    152. Public Property FolderPath As String
    153. Public Property FolderChDate As String
    154. Public Property FolderStatus As String
    155. Public Property FolderLastStatus As String
    156. End Class


    Beste Grüße
    Martin
    Wann genau tritt der Fehler auf?
    Und was sind VistaFolderBrowserDialog und TaskDialog
    Ich kann das scheinbar nicht nachstellen ohne mir irgend ein nugetpacket oder so zu installieren. Und das machen ich nicht.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo,

    der Fehler tritt auf in Zeile 78. Genau dann, wenn er die Textbox aktualisieren soll.
    Ich bin schon soweit, das es etwas mit dem Thread-Handling zu tun hat. Aber keien Schimmer wie ich das lösen kann.
    VistaFolderBrowserDialog und TaskDialog sind aus den ookii.org/software/dialogs/ und ein Substitut für FolderBrowserDialog und MsgBox.
    Hallo,

    danke für den Hinweis. Ich habe mir das angesehen - aber ich meine so recht verstanden habe ich es zwar logisch - aber syntaktisch und von der Zuordnung her wohl nicht. Folgendes habe ich gemacht - aber ich bekomme noch immer den Fehler:

    System.InvalidOperationException
    HResult=0x80131509
    Nachricht = Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet.
    Quelle = WindowsBase
    Stapelüberwachung:
    bei System.Windows.Threading.Dispatcher.VerifyAccess()
    bei System.Windows.DependencyObject.GetValue(DependencyProperty dp)
    bei System.Windows.Controls.TextBox.get_Text()
    bei FolderWatch.MainWindow.FillBoxSub(String NewText) in F:\source\Projects\FolderWatch\FolderWatch\MainWindow.xaml.vb: Zeile92

    Den Code habe ich wie folgt angepasst Zeilen 13/86/87:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Ookii.Dialogs.Wpf
    3. Imports System.Windows.Threading
    4. Class MainWindow
    5. #Region "Definitions"
    6. Dim SaveFile As String = FileIO.FileSystem.CurrentDirectory & "\settings.cnf"
    7. Dim TheFolders As New List(Of FolderItems)
    8. Dim ActionFile As String = FileIO.FileSystem.CurrentDirectory & "\actionlog.acl"
    9. [b][color=#FF0000]Public Delegate Sub UpdTB(NewText As String)[/color][/b]
    10. #End Region
    11. #Region "Subs and Funcs"
    12. Private Sub Init()
    13. 'Load SaveFile
    14. LoadList()
    15. 'Fill Grid
    16. DG_FolderList.ItemsSource = TheFolders
    17. CheckButtons()
    18. End Sub
    19. Private Sub SaveList()
    20. If File.Exists(SaveFile) Then File.Delete(SaveFile)
    21. For Each LineElement In TheFolders
    22. Dim LineOut As String = LineElement.FolderPath & ";" & LineElement.FolderChDate & ";" & LineElement.FolderLastStatus & vbLf
    23. File.AppendAllText(SaveFile, LineOut)
    24. Next
    25. End Sub
    26. Private Sub LoadList()
    27. Dim Tlist As New List(Of String)
    28. TheFolders.Clear()
    29. If File.Exists(SaveFile) Then
    30. Tlist.AddRange(File.ReadAllLines(SaveFile).ToArray)
    31. For Each LineElement In Tlist
    32. Dim LineParts() As String = LineElement.Split(";")
    33. Dim TFObject As New FolderItems With {
    34. .FolderPath = LineParts(0)}
    35. If LineParts.Length > 1 Then TFObject.FolderChDate = LineParts(1)
    36. If LineParts.Length > 2 Then TFObject.FolderLastStatus = LineParts(2)
    37. TFObject.FolderStatus = "stopped"
    38. TheFolders.Add(TFObject)
    39. Next
    40. DG_FolderList.Items.Refresh()
    41. End If
    42. CheckButtons()
    43. End Sub
    44. Private Sub LoadActionLog()
    45. If File.Exists(ActionFile) Then
    46. TB_WatchLog.Text = File.ReadAllText(ActionFile)
    47. End If
    48. End Sub
    49. Private Sub CheckButtons()
    50. If TheFolders.Count > 0 Then
    51. BT_Start.IsEnabled = True
    52. BT_DelFolder.IsEnabled = True
    53. Else
    54. BT_Start.IsEnabled = False
    55. BT_DelFolder.IsEnabled = False
    56. End If
    57. If TB_WatchLog.Text = "" Then
    58. BT_CLRLog.IsEnabled = False
    59. Else
    60. BT_CLRLog.IsEnabled = True
    61. End If
    62. End Sub
    63. Private Sub UpdFolderChg(ChgFile As String, ChgType As String)
    64. Dim FolderPath As String = ChgFile.Substring(0, ChgFile.LastIndexOf("\"))
    65. If Not FolderPath = "" Then
    66. Dim Idx As Integer = TheFolders.FindIndex(Function(x) x.FolderPath.Equals(FolderPath))
    67. If Not Idx = -1 Then
    68. TheFolders(Idx).FolderChDate = Now
    69. TheFolders(Idx).FolderLastStatus = ChgType
    70. End If
    71. Dim NewEntry As String = Now & " " & ChgType & " : " & ChgFile & vbLf
    72. File.AppendAllText(ActionFile, NewEntry)
    73. 'FillBoxSub(NewEntry & vbLf)
    74. Dim d As New UpdTB(AddressOf FillBoxSub)
    75. d.Invoke(NewEntry & vbLf)
    76. End If
    77. End Sub
    78. Private Sub FillBoxSub(NewText As String)
    79. Dim MsgText As String = NewText & TB_WatchLog.Text
    80. TB_WatchLog.Text = MsgText
    81. End Sub
    82. Private Sub AddWatch(FolderItem As FolderItems)
    83. Try
    84. If Directory.Exists(FolderItem.FolderPath) Then
    85. Dim FWatch As New FileSystemWatcher With {
    86. .Path = FolderItem.FolderPath,
    87. .Filter = "",
    88. .EnableRaisingEvents = True,
    89. .IncludeSubdirectories = False,
    90. .NotifyFilter = NotifyFilters.Attributes Or
    91. NotifyFilters.CreationTime Or
    92. NotifyFilters.DirectoryName Or
    93. NotifyFilters.FileName Or
    94. NotifyFilters.LastAccess Or
    95. NotifyFilters.LastWrite Or
    96. NotifyFilters.Security Or
    97. NotifyFilters.Size
    98. }
    99. AddHandler FWatch.Created, AddressOf FSWNotify
    100. AddHandler FWatch.Deleted, AddressOf FSWNotify
    101. AddHandler FWatch.Changed, AddressOf FSWNotify
    102. AddHandler FWatch.Error, AddressOf FSWOnError
    103. End If
    104. FolderItem.FolderStatus = "watching"
    105. Catch ex As Exception
    106. ShowError(ex)
    107. End Try
    108. End Sub
    109. Private Sub FSWNotify(sender As Object, e As FileSystemEventArgs)
    110. UpdFolderChg(e.FullPath, e.ChangeType.ToString)
    111. End Sub
    112. Private Sub FSWOnError(sender As Object, e As ErrorEventArgs)
    113. Dim ex As Exception = e.GetException()
    114. ShowError(ex)
    115. CheckButtons()
    116. End Sub
    117. Private Sub ShowError(ex As Exception)
    118. Dim Dlg As New TaskDialog With {
    119. .Content = ex.Message & vbLf & ex.StackTrace,
    120. .WindowTitle = "Exception occured"}
    121. Dlg.ShowDialog()
    122. End Sub
    123. #End Region
    124. #Region "Main"
    125. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    126. Init()
    127. End Sub
    128. #End Region
    129. #Region "Buttons"
    130. Private Sub BT_AddFolder_Click(sender As Object, e As RoutedEventArgs) Handles BT_AddFolder.Click
    131. Dim OFD As New VistaFolderBrowserDialog
    132. OFD.Description = "Verzeichnis auswählen"
    133. If OFD.ShowDialog Then
    134. Dim TItem As New FolderItems With {.FolderPath = OFD.SelectedPath, .FolderChDate = Now, .FolderStatus = "stopped", .FolderLastStatus = "nope"}
    135. TheFolders.Add(TItem)
    136. DG_FolderList.Items.Refresh()
    137. End If
    138. BT_Start.IsEnabled = False
    139. BT_Stop.IsEnabled = True
    140. SaveList()
    141. CheckButtons()
    142. End Sub
    143. Private Sub BT_DelFolder_Click(sender As Object, e As RoutedEventArgs) Handles BT_DelFolder.Click
    144. If Not DG_FolderList.SelectedIndex = -1 Then
    145. TheFolders.RemoveAt(DG_FolderList.SelectedIndex)
    146. DG_FolderList.Items.Refresh()
    147. End If
    148. SaveList()
    149. CheckButtons()
    150. End Sub
    151. Private Sub BT_CLRLog_Click(sender As Object, e As RoutedEventArgs) Handles BT_CLRLog.Click
    152. TB_WatchLog.Text = ""
    153. CheckButtons()
    154. End Sub
    155. Private Sub BT_Start_Click(sender As Object, e As RoutedEventArgs) Handles BT_Start.Click
    156. For Each MemItem As FolderItems In TheFolders
    157. AddWatch(MemItem)
    158. Next
    159. DG_FolderList.Items.Refresh()
    160. End Sub
    161. Private Sub BT_Stop_Click(sender As Object, e As RoutedEventArgs) Handles BT_Stop.Click
    162. BT_Start.IsEnabled = True
    163. BT_Stop.IsEnabled = False
    164. End Sub
    165. #End Region
    166. End Class
    167. Public Class FolderItems
    168. Public Property FolderPath As String
    169. Public Property FolderChDate As String
    170. Public Property FolderStatus As String
    171. Public Property FolderLastStatus As String
    172. End Class
    Hinweis am Rand: Bei WinForms war es noch ungültiger threadübergreifender Prozess. Bei WPF ist es eben dieser Fehler. Da der FSW in einem anderen Thread arbeitet als das GUI, gibt es den Fehler, wenn im Nebenthread probiert wird, das GUI zu ändern. Du musst z.B. mit Me.Dispatcher.Invoke bzw. .BeginInvoke arbeiten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,

    jetzt konnte ich das Thema lösen. Die offizielle Doku dazu fand ich verwirren. Für alle die es Interessiert - hier die Lösung:

    VB.NET-Quellcode

    1. Private Sub UpdFolderChg(ChgFile As String, ChgType As String)
    2. Dim FolderPath As String = ChgFile.Substring(0, ChgFile.LastIndexOf("\"))
    3. If Not FolderPath = "" Then
    4. Dim Idx As Integer = TheFolders.FindIndex(Function(x) x.FolderPath.Equals(FolderPath))
    5. If Not Idx = -1 Then
    6. TheFolders(Idx).FolderChDate = Now
    7. TheFolders(Idx).FolderLastStatus = ChgType
    8. End If
    9. Dim NewEntry As String = Now & " " & ChgType & " : " & ChgFile & vbLf
    10. Me.Dispatcher.Invoke(DispatcherPriority.Normal, New Action(Sub()
    11. Me.TB_WatchLog.Text = NewEntry & TB_WatchLog.Text
    12. End Sub))
    13. End If
    14. End Sub

    Hier dar ganze Code (Für den Zusammenhang):
    Komplettcode

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Ookii.Dialogs.Wpf
    3. Imports System.Windows.Threading
    4. Class MainWindow
    5. #Region "Definitions"
    6. Dim SaveFile As String = FileIO.FileSystem.CurrentDirectory & "\settings.cnf"
    7. Dim TheFolders As New List(Of FolderItems)
    8. Dim ActionFile As String = FileIO.FileSystem.CurrentDirectory & "\actionlog.acl"
    9. Public Delegate Sub UpdTB(NewText As String)
    10. #End Region
    11. #Region "Subs and Funcs"
    12. Private Sub Init()
    13. 'Load SaveFile
    14. LoadList()
    15. 'Fill Grid
    16. DG_FolderList.ItemsSource = TheFolders
    17. CheckButtons()
    18. End Sub
    19. Private Sub SaveList()
    20. If File.Exists(SaveFile) Then File.Delete(SaveFile)
    21. For Each LineElement In TheFolders
    22. Dim LineOut As String = LineElement.FolderPath & ";" & LineElement.FolderChDate & ";" & LineElement.FolderLastStatus & vbLf
    23. File.AppendAllText(SaveFile, LineOut)
    24. Next
    25. End Sub
    26. Private Sub LoadList()
    27. Dim Tlist As New List(Of String)
    28. TheFolders.Clear()
    29. If File.Exists(SaveFile) Then
    30. Tlist.AddRange(File.ReadAllLines(SaveFile).ToArray)
    31. For Each LineElement In Tlist
    32. Dim LineParts() As String = LineElement.Split(";")
    33. Dim TFObject As New FolderItems With {
    34. .FolderPath = LineParts(0)}
    35. If LineParts.Length > 1 Then TFObject.FolderChDate = LineParts(1)
    36. If LineParts.Length > 2 Then TFObject.FolderLastStatus = LineParts(2)
    37. TFObject.FolderStatus = "stopped"
    38. TheFolders.Add(TFObject)
    39. Next
    40. DG_FolderList.Items.Refresh()
    41. End If
    42. CheckButtons()
    43. End Sub
    44. Private Sub LoadActionLog()
    45. If File.Exists(ActionFile) Then
    46. TB_WatchLog.Text = File.ReadAllText(ActionFile)
    47. End If
    48. End Sub
    49. Private Sub CheckButtons()
    50. If TheFolders.Count > 0 Then
    51. BT_Start.IsEnabled = True
    52. BT_DelFolder.IsEnabled = True
    53. Else
    54. BT_Start.IsEnabled = False
    55. BT_DelFolder.IsEnabled = False
    56. End If
    57. If TB_WatchLog.Text = "" Then
    58. BT_CLRLog.IsEnabled = False
    59. Else
    60. BT_CLRLog.IsEnabled = True
    61. End If
    62. End Sub
    63. Private Sub UpdFolderChg(ChgFile As String, ChgType As String)
    64. Dim FolderPath As String = ChgFile.Substring(0, ChgFile.LastIndexOf("\"))
    65. If Not FolderPath = "" Then
    66. Dim Idx As Integer = TheFolders.FindIndex(Function(x) x.FolderPath.Equals(FolderPath))
    67. If Not Idx = -1 Then
    68. TheFolders(Idx).FolderChDate = Now
    69. TheFolders(Idx).FolderLastStatus = ChgType
    70. End If
    71. Dim NewEntry As String = Now & " " & ChgType & " : " & ChgFile & vbLf
    72. Me.Dispatcher.Invoke(DispatcherPriority.Normal, New Action(Sub()
    73. Me.TB_WatchLog.Text = NewEntry & TB_WatchLog.Text
    74. End Sub))
    75. End If
    76. End Sub
    77. Private Sub FillBoxSub(NewText As String)
    78. End Sub
    79. Private Sub AddWatch(FolderItem As FolderItems)
    80. Try
    81. If Directory.Exists(FolderItem.FolderPath) Then
    82. Dim FWatch As New FileSystemWatcher With {
    83. .Path = FolderItem.FolderPath,
    84. .Filter = "",
    85. .EnableRaisingEvents = True,
    86. .IncludeSubdirectories = False,
    87. .NotifyFilter = NotifyFilters.Attributes Or
    88. NotifyFilters.CreationTime Or
    89. NotifyFilters.DirectoryName Or
    90. NotifyFilters.FileName Or
    91. NotifyFilters.LastAccess Or
    92. NotifyFilters.LastWrite Or
    93. NotifyFilters.Security Or
    94. NotifyFilters.Size
    95. }
    96. AddHandler FWatch.Created, AddressOf FSWNotify
    97. AddHandler FWatch.Deleted, AddressOf FSWNotify
    98. AddHandler FWatch.Changed, AddressOf FSWNotify
    99. AddHandler FWatch.Error, AddressOf FSWOnError
    100. End If
    101. FolderItem.FolderStatus = "watching"
    102. Catch ex As Exception
    103. ShowError(ex)
    104. End Try
    105. End Sub
    106. Private Sub FSWNotify(sender As Object, e As FileSystemEventArgs)
    107. UpdFolderChg(e.FullPath, e.ChangeType.ToString)
    108. End Sub
    109. Private Sub FSWOnError(sender As Object, e As ErrorEventArgs)
    110. Dim ex As Exception = e.GetException()
    111. ShowError(ex)
    112. CheckButtons()
    113. End Sub
    114. Private Sub ShowError(ex As Exception)
    115. Dim WDERR As New WD_Msg With {.MSGTitle = ex.Message, .MSGText = ex.StackTrace}
    116. WDERR.ShowDialog()
    117. End Sub
    118. #End Region
    119. #Region "Main"
    120. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    121. Init()
    122. End Sub
    123. #End Region
    124. #Region "Buttons"
    125. Private Sub BT_AddFolder_Click(sender As Object, e As RoutedEventArgs) Handles BT_AddFolder.Click
    126. Dim OFD As New VistaFolderBrowserDialog
    127. OFD.Description = "Verzeichnis auswählen"
    128. If OFD.ShowDialog Then
    129. Dim TItem As New FolderItems With {.FolderPath = OFD.SelectedPath, .FolderChDate = Now, .FolderStatus = "stopped", .FolderLastStatus = "nope"}
    130. TheFolders.Add(TItem)
    131. DG_FolderList.Items.Refresh()
    132. End If
    133. BT_Start.IsEnabled = False
    134. BT_Stop.IsEnabled = True
    135. SaveList()
    136. CheckButtons()
    137. End Sub
    138. Private Sub BT_DelFolder_Click(sender As Object, e As RoutedEventArgs) Handles BT_DelFolder.Click
    139. If Not DG_FolderList.SelectedIndex = -1 Then
    140. TheFolders.RemoveAt(DG_FolderList.SelectedIndex)
    141. DG_FolderList.Items.Refresh()
    142. End If
    143. SaveList()
    144. CheckButtons()
    145. End Sub
    146. Private Sub BT_CLRLog_Click(sender As Object, e As RoutedEventArgs) Handles BT_CLRLog.Click
    147. TB_WatchLog.Text = ""
    148. CheckButtons()
    149. End Sub
    150. Private Sub BT_Start_Click(sender As Object, e As RoutedEventArgs) Handles BT_Start.Click
    151. For Each MemItem As FolderItems In TheFolders
    152. AddWatch(MemItem)
    153. Next
    154. DG_FolderList.Items.Refresh()
    155. CheckButtons()
    156. End Sub
    157. Private Sub BT_Stop_Click(sender As Object, e As RoutedEventArgs) Handles BT_Stop.Click
    158. BT_Start.IsEnabled = True
    159. BT_Stop.IsEnabled = False
    160. End Sub
    161. #End Region
    162. End Class
    163. Public Class FolderItems
    164. Public Property FolderPath As String
    165. Public Property FolderChDate As String
    166. Public Property FolderStatus As String
    167. Public Property FolderLastStatus As String
    168. End Class



    aufgrund des Codeumfangs Spoiler hinzugefügt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()