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:
Hier der Quellcode:
Und der VB-Code
Beste Grüße
Martin
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:
Hier der Quellcode:
XML-Quellcode
- <Window x:Class="MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:local="clr-namespace:FolderWatch"
- mc:Ignorable="d"
- Title="MainWindow" Height="464" Width="800">
- <Grid Margin="0,0,0,-6">
- <Grid.RowDefinitions>
- <RowDefinition Height="229.021" />
- <RowDefinition />
- </Grid.RowDefinitions>
- <Grid.ColumnDefinitions>
- <ColumnDefinition />
- <ColumnDefinition Width="100" />
- </Grid.ColumnDefinitions>
- <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">
- </DataGrid>
- <Label Content="Watched Folder" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="26" Width="93" />
- <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" />
- <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" />
- <Label Content="Watch Log" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="26" Width="93" Grid.Row="1" />
- <TextBox x:Name="TB_WatchLog" Margin="10,36,10,45" Grid.Row="1" TextWrapping="Wrap" />
- <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" />
- <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" />
- <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" />
- </Grid>
- </Window>
Und der VB-Code
VB.NET-Quellcode
- Imports System.IO
- Imports Ookii.Dialogs.Wpf
- Class MainWindow
- #Region "Definitions"
- Dim SaveFile As String = FileIO.FileSystem.CurrentDirectory & "\settings.cnf"
- Dim TheFolders As New List(Of FolderItems)
- #End Region
- #Region "Subs and Funcs"
- Private Sub Init()
- 'Load SaveFile
- LoadList()
- 'Fill Grid
- DG_FolderList.ItemsSource = TheFolders
- CheckButtons()
- End Sub
- Private Sub SaveList()
- If File.Exists(SaveFile) Then File.Delete(SaveFile)
- For Each LineElement In TheFolders
- Dim LineOut As String = LineElement.FolderPath & ";" & LineElement.FolderChDate & ";" & LineElement.FolderLastStatus
- File.AppendAllText(SaveFile, LineOut)
- Next
- End Sub
- Private Sub LoadList()
- Dim Tlist As New List(Of String)
- TheFolders.Clear()
- If File.Exists(SaveFile) Then
- Tlist.AddRange(File.ReadAllLines(SaveFile).ToArray)
- For Each LineElement In Tlist
- Dim LineParts() As String = LineElement.Split(";")
- Dim TFObject As New FolderItems With {
- .FolderPath = LineParts(0)}
- If LineParts.Length > 1 Then TFObject.FolderChDate = LineParts(1)
- If LineParts.Length > 2 Then TFObject.FolderLastStatus = LineParts(2)
- TFObject.FolderStatus = "stopped"
- TheFolders.Add(TFObject)
- Next
- DG_FolderList.Items.Refresh()
- End If
- CheckButtons()
- End Sub
- Private Sub CheckButtons()
- If TheFolders.Count > 0 Then
- BT_Start.IsEnabled = True
- BT_DelFolder.IsEnabled = True
- Else
- BT_Start.IsEnabled = False
- BT_DelFolder.IsEnabled = False
- End If
- If TB_WatchLog.Text = "" Then
- BT_CLRLog.IsEnabled = False
- Else
- BT_CLRLog.IsEnabled = True
- End If
- End Sub
- Private Sub UpdFolderChg(ChgFile As String, ChgType As String)
- Dim FolderPath As String = ChgFile.Substring(0, ChgFile.LastIndexOf("\"))
- If Not FolderPath = "" Then
- Dim Idx As Integer = TheFolders.FindIndex(Function(x) x.FolderPath.Equals(FolderPath))
- If Not Idx = -1 Then
- TheFolders(Idx).FolderChDate = Now
- TheFolders(Idx).FolderLastStatus = ChgType
- End If
- FillBoxSub(Now & " " & ChgType & " : " & ChgFile & vbLf)
- End If
- End Sub
- Private Sub FillBoxSub(NewText As String)
- Dim MsgText As String = NewText & TB_WatchLog.Text
- TB_WatchLog.Text = MsgText
- End Sub
- Private Sub AddWatch(FolderItem As FolderItems)
- Try
- If Directory.Exists(FolderItem.FolderPath) Then
- Dim FWatch As New FileSystemWatcher With {
- .Path = FolderItem.FolderPath,
- .Filter = "",
- .EnableRaisingEvents = True,
- .IncludeSubdirectories = False,
- .NotifyFilter = NotifyFilters.Attributes Or
- NotifyFilters.CreationTime Or
- NotifyFilters.DirectoryName Or
- NotifyFilters.FileName Or
- NotifyFilters.LastAccess Or
- NotifyFilters.LastWrite Or
- NotifyFilters.Security Or
- NotifyFilters.Size
- }
- AddHandler FWatch.Created, AddressOf FSWNotify
- AddHandler FWatch.Deleted, AddressOf FSWNotify
- AddHandler FWatch.Changed, AddressOf FSWNotify
- AddHandler FWatch.Error, AddressOf FSWOnError
- End If
- FolderItem.FolderStatus = "watching"
- Catch ex As Exception
- ShowError(ex)
- End Try
- End Sub
- Private Sub FSWNotify(sender As Object, e As FileSystemEventArgs)
- UpdFolderChg(e.FullPath, e.ChangeType.ToString)
- End Sub
- Private Sub FSWOnError(sender As Object, e As ErrorEventArgs)
- Dim ex As Exception = e.GetException()
- ShowError(ex)
- CheckButtons()
- End Sub
- Private Sub ShowError(ex As Exception)
- Dim Dlg As New TaskDialog With {
- .Content = ex.Message & vbLf & ex.StackTrace,
- .WindowTitle = "Exception occured"}
- Dlg.ShowDialog()
- End Sub
- #End Region
- #Region "Main"
- Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
- Init()
- End Sub
- #End Region
- #Region "Buttons"
- Private Sub BT_AddFolder_Click(sender As Object, e As RoutedEventArgs) Handles BT_AddFolder.Click
- Dim OFD As New VistaFolderBrowserDialog
- OFD.Description = "Verzeichnis auswählen"
- If OFD.ShowDialog Then
- Dim TItem As New FolderItems With {.FolderPath = OFD.SelectedPath, .FolderChDate = Now, .FolderStatus = "stopped", .FolderLastStatus = "nope"}
- TheFolders.Add(TItem)
- DG_FolderList.Items.Refresh()
- End If
- SaveList()
- CheckButtons()
- End Sub
- Private Sub BT_DelFolder_Click(sender As Object, e As RoutedEventArgs) Handles BT_DelFolder.Click
- If Not DG_FolderList.SelectedIndex = -1 Then
- TheFolders.RemoveAt(DG_FolderList.SelectedIndex)
- DG_FolderList.Items.Refresh()
- End If
- SaveList()
- CheckButtons()
- End Sub
- Private Sub BT_CLRLog_Click(sender As Object, e As RoutedEventArgs) Handles BT_CLRLog.Click
- TB_WatchLog.Text = ""
- CheckButtons()
- End Sub
- Private Sub BT_Start_Click(sender As Object, e As RoutedEventArgs) Handles BT_Start.Click
- For Each MemItem As FolderItems In TheFolders
- AddWatch(MemItem)
- Next
- DG_FolderList.Items.Refresh()
- End Sub
- Private Sub BT_Stop_Click(sender As Object, e As RoutedEventArgs) Handles BT_Stop.Click
- End Sub
- #End Region
- End Class
- Public Class FolderItems
- Public Property FolderPath As String
- Public Property FolderChDate As String
- Public Property FolderStatus As String
- Public Property FolderLastStatus As String
- End Class
Beste Grüße
Martin