From a1c96731ef1393819e6910a5676664090a09d816 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Tue, 5 Feb 2019 16:47:32 +0100 Subject: [PATCH] jj: folder watcher --- EDMI_ClientSuite/EDMI_ClientSuite.vbproj | 5 +- EDMI_ClientSuite/frmMain.Designer.vb | 43 ++++---- Filesystem/FileWatcher.vb | 110 +++++++++++++++++++ Filesystem/Filesystem.vbproj | 1 + TestGUI/FolderWatcher.Designer.vb | 49 +++++++++ TestGUI/FolderWatcher.resx | 120 +++++++++++++++++++++ TestGUI/FolderWatcher.vb | 31 ++++++ TestGUI/My Project/Application.Designer.vb | 28 ++--- TestGUI/My Project/Application.myapp | 5 +- TestGUI/TestGUI.vbproj | 13 +++ 10 files changed, 365 insertions(+), 40 deletions(-) create mode 100644 Filesystem/FileWatcher.vb create mode 100644 TestGUI/FolderWatcher.Designer.vb create mode 100644 TestGUI/FolderWatcher.resx create mode 100644 TestGUI/FolderWatcher.vb diff --git a/EDMI_ClientSuite/EDMI_ClientSuite.vbproj b/EDMI_ClientSuite/EDMI_ClientSuite.vbproj index b209e02b..1cd69976 100644 --- a/EDMI_ClientSuite/EDMI_ClientSuite.vbproj +++ b/EDMI_ClientSuite/EDMI_ClientSuite.vbproj @@ -86,6 +86,7 @@ False ..\Modules.Logging\bin\Debug\NLog.dll + @@ -322,7 +323,9 @@ - + + Designer + diff --git a/EDMI_ClientSuite/frmMain.Designer.vb b/EDMI_ClientSuite/frmMain.Designer.vb index aa629754..f8156f5d 100644 --- a/EDMI_ClientSuite/frmMain.Designer.vb +++ b/EDMI_ClientSuite/frmMain.Designer.vb @@ -19,11 +19,10 @@ Partial Class frmMain 'Do not modify it using the code editor. Private Sub InitializeComponent() - Me.components = New System.ComponentModel.Container() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmMain)) Dim PushTransition1 As DevExpress.Utils.Animation.PushTransition = New DevExpress.Utils.Animation.PushTransition() Me.RibbonControl = New DevExpress.XtraBars.Ribbon.RibbonControl() - Me.MainMenu = New DevExpress.XtraBars.Ribbon.ApplicationMenu(Me.components) + Me.MainMenu = New DevExpress.XtraBars.Ribbon.ApplicationMenu() Me.BarButtonExit = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonUserSettings = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonConnectionSettings = New DevExpress.XtraBars.BarButtonItem() @@ -38,6 +37,8 @@ Partial Class frmMain Me.BarButtonDeleteControl = New DevExpress.XtraBars.BarButtonItem() Me.LabelCurrentLanguage = New DevExpress.XtraBars.BarStaticItem() Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem() + Me.BarWorkspaceMenuItem1 = New DevExpress.XtraBars.BarWorkspaceMenuItem() + Me.WorkspaceManager1 = New DevExpress.Utils.WorkspaceManager() Me.RibbonPageCategoryEntityDesigner = New DevExpress.XtraBars.Ribbon.RibbonPageCategory() Me.RibbonPageControlActions = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.RibbonPageGroup5 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() @@ -49,9 +50,9 @@ Partial Class frmMain Me.RibbonPageWorkflow = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.RibbonPageGroup4 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonStatusBar = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() - Me.DocumentManager = New DevExpress.XtraBars.Docking2010.DocumentManager(Me.components) - Me.TabbedView1 = New DevExpress.XtraBars.Docking2010.Views.Tabbed.TabbedView(Me.components) - Me.DockManager = New DevExpress.XtraBars.Docking.DockManager(Me.components) + Me.DocumentManager = New DevExpress.XtraBars.Docking2010.DocumentManager() + Me.TabbedView1 = New DevExpress.XtraBars.Docking2010.Views.Tabbed.TabbedView() + Me.DockManager = New DevExpress.XtraBars.Docking.DockManager() Me.panelContainer1 = New DevExpress.XtraBars.Docking.DockPanel() Me.DockPanelGlobix = New DevExpress.XtraBars.Docking.DockPanel() Me.DockPanel1_Container = New DevExpress.XtraBars.Docking.ControlContainer() @@ -59,8 +60,6 @@ Partial Class frmMain Me.DockPanelProcessManager = New DevExpress.XtraBars.Docking.DockPanel() Me.DockPanel2_Container = New DevExpress.XtraBars.Docking.ControlContainer() Me.ProcessManagerWidget = New EDMI_ClientSuite.ProcessManagerWidget() - Me.BarWorkspaceMenuItem1 = New DevExpress.XtraBars.BarWorkspaceMenuItem() - Me.WorkspaceManager1 = New DevExpress.Utils.WorkspaceManager() CType(Me.RibbonControl, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.MainMenu, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.DocumentManager, System.ComponentModel.ISupportInitialize).BeginInit() @@ -189,10 +188,22 @@ Partial Class frmMain Me.BarButtonItem2.Id = 16 Me.BarButtonItem2.Name = "BarButtonItem2" ' + 'BarWorkspaceMenuItem1 + ' + Me.BarWorkspaceMenuItem1.Caption = "BarWorkspaceMenuItem1" + Me.BarWorkspaceMenuItem1.Id = 17 + Me.BarWorkspaceMenuItem1.Name = "BarWorkspaceMenuItem1" + Me.BarWorkspaceMenuItem1.WorkspaceManager = Me.WorkspaceManager1 + ' + 'WorkspaceManager1 + ' + Me.WorkspaceManager1.TargetControl = Me + Me.WorkspaceManager1.TransitionType = PushTransition1 + ' 'RibbonPageCategoryEntityDesigner ' Me.RibbonPageCategoryEntityDesigner.AutoStretchPageHeaders = True - Me.RibbonPageCategoryEntityDesigner.Color = System.Drawing.Color.Red + Me.RibbonPageCategoryEntityDesigner.Color = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer)) Me.RibbonPageCategoryEntityDesigner.Name = "RibbonPageCategoryEntityDesigner" Me.RibbonPageCategoryEntityDesigner.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPageControlActions}) Me.RibbonPageCategoryEntityDesigner.Text = "Entitäten Designer" @@ -348,27 +359,15 @@ Partial Class frmMain Me.DockPanel2_Container.Size = New System.Drawing.Size(337, 163) Me.DockPanel2_Container.TabIndex = 0 ' - 'ProcessManagerOverview + 'ProcessManagerWidget ' Me.ProcessManagerWidget.DataSource = Nothing Me.ProcessManagerWidget.Dock = System.Windows.Forms.DockStyle.Fill Me.ProcessManagerWidget.Location = New System.Drawing.Point(0, 0) - Me.ProcessManagerWidget.Name = "ProcessManagerOverview" + Me.ProcessManagerWidget.Name = "ProcessManagerWidget" Me.ProcessManagerWidget.Size = New System.Drawing.Size(337, 163) Me.ProcessManagerWidget.TabIndex = 0 ' - 'BarWorkspaceMenuItem1 - ' - Me.BarWorkspaceMenuItem1.Caption = "BarWorkspaceMenuItem1" - Me.BarWorkspaceMenuItem1.Id = 17 - Me.BarWorkspaceMenuItem1.Name = "BarWorkspaceMenuItem1" - Me.BarWorkspaceMenuItem1.WorkspaceManager = Me.WorkspaceManager1 - ' - 'WorkspaceManager1 - ' - Me.WorkspaceManager1.TargetControl = Me - Me.WorkspaceManager1.TransitionType = PushTransition1 - ' 'frmMain ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) diff --git a/Filesystem/FileWatcher.vb b/Filesystem/FileWatcher.vb new file mode 100644 index 00000000..215a4413 --- /dev/null +++ b/Filesystem/FileWatcher.vb @@ -0,0 +1,110 @@ +Imports System.IO +Imports DigitalData.Modules.Logging + +Public Class FileWatcher + Private ReadOnly _Logger As Logger + Private ReadOnly _Watchers As List(Of FileSystemWatcher) + Private ReadOnly _Files As Dictionary(Of String, FileProperties) + + Private _Path As String + + Public OfficeFilters As New List(Of String) From {"docx", "xlsx", "pptx"} + + Public Sub New(LogConfig As LogConfig, Path As String) + _Logger = LogConfig.GetLogger() + _Files = New Dictionary(Of String, FileProperties) + _Watchers = New List(Of FileSystemWatcher) + _Path = Path + + For Each oFilePath As String In Directory.EnumerateFiles(_Path) + Try + If IO.File.Exists(oFilePath) Then + _Files.Add(oFilePath, New FileProperties With { + .CreatedAt = DateTime.Now, + .ChangedAt = Nothing + }) + End If + Catch ex As Exception + _Logger.Error(ex) + _Logger.Warn("File {0} cannot be watched!") + End Try + Next + End Sub + + Public Sub Add(Filter As String, Optional SpecialTreatmentFilters As List(Of String) = Nothing) + _Watchers.Add(CreateWatcher(Filter)) + End Sub + + Public Sub Add(Filters As List(Of String), Optional SpecialTreatmentFilters As List(Of String) = Nothing) + For Each oFilter In Filters + _Watchers.Add(CreateWatcher(oFilter)) + Next + End Sub + + Private Function CreateWatcher(Filter As String) + Dim oWatcher = New FileSystemWatcher() With { + .Path = _Path, + .Filter = Filter, + .NotifyFilter = NotifyFilters.CreationTime _ + Or NotifyFilters.LastAccess _ + Or NotifyFilters.LastWrite _ + Or NotifyFilters.Size _ + Or NotifyFilters.FileName _ + Or NotifyFilters.Attributes + } + + AddHandler oWatcher.Created, AddressOf HandleFileCreated + AddHandler oWatcher.Changed, AddressOf HandleFileChanged + AddHandler oWatcher.Deleted, AddressOf HandleFileDeleted + AddHandler oWatcher.Renamed, AddressOf HandleFileRenamed + + Return oWatcher + End Function + + Private Sub HandleFileCreated(sender As Object, e As FileSystemEventArgs) + _Files.Add(e.FullPath, New FileProperties()) + _Logger.Info("[Created] " & e.FullPath) + End Sub + Private Sub HandleFileChanged(sender As Object, e As FileSystemEventArgs) + _Files.Item(e.FullPath).ChangedAt = DateTime.Now + _Logger.Info("[Changed] " & e.FullPath) + End Sub + Private Sub HandleFileDeleted(sender As Object, e As FileSystemEventArgs) + _Files.Remove(e.FullPath) + _Logger.Info("[Removed] " & e.FullPath) + End Sub + + Private Sub HandleFileRenamed(sender As Object, e As RenamedEventArgs) + Dim oProperties = _Files.Item(e.OldFullPath) + _Files.Remove(e.OldFullPath) + _Files.Add(e.FullPath, oProperties) + ' Soll eine umbenannte datei als NEU gelten? + + _Logger.Info("[Renamed] {0} --> {1}", e.OldFullPath, e.FullPath) + End Sub + + Public Sub Start() + For Each oWatcher In _Watchers + oWatcher.EnableRaisingEvents = True + Next + End Sub + + Public Sub [Stop]() + For Each oWatcher In _Watchers + If Not IsNothing(oWatcher) Then + oWatcher.EnableRaisingEvents = False + oWatcher.Dispose() + End If + Next + End Sub + + Public Class FileProperties + Public CreatedAt As DateTime + Public ChangedAt As DateTime + + Public Sub New() + CreatedAt = DateTime.Now + ChangedAt = Nothing + End Sub + End Class +End Class diff --git a/Filesystem/Filesystem.vbproj b/Filesystem/Filesystem.vbproj index a0363c24..f7fd9859 100644 --- a/Filesystem/Filesystem.vbproj +++ b/Filesystem/Filesystem.vbproj @@ -80,6 +80,7 @@ + True diff --git a/TestGUI/FolderWatcher.Designer.vb b/TestGUI/FolderWatcher.Designer.vb new file mode 100644 index 00000000..a0c1cbba --- /dev/null +++ b/TestGUI/FolderWatcher.Designer.vb @@ -0,0 +1,49 @@ + +Partial Class FolderWatcher + Inherits System.Windows.Forms.Form + + 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Wird vom Windows Form-Designer benötigt. + Private components As System.ComponentModel.IContainer + + 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. + 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. + 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. + + Private Sub InitializeComponent() + Me.ListBox1 = New System.Windows.Forms.ListBox() + Me.SuspendLayout() + ' + 'ListBox1 + ' + Me.ListBox1.FormattingEnabled = True + Me.ListBox1.Location = New System.Drawing.Point(12, 12) + Me.ListBox1.Name = "ListBox1" + Me.ListBox1.Size = New System.Drawing.Size(388, 420) + Me.ListBox1.TabIndex = 0 + ' + 'FolderWatcher + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(413, 450) + Me.Controls.Add(Me.ListBox1) + Me.Name = "FolderWatcher" + Me.Text = "FolderWatcher" + Me.ResumeLayout(False) + + End Sub + + Friend WithEvents ListBox1 As ListBox +End Class diff --git a/TestGUI/FolderWatcher.resx b/TestGUI/FolderWatcher.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TestGUI/FolderWatcher.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TestGUI/FolderWatcher.vb b/TestGUI/FolderWatcher.vb new file mode 100644 index 00000000..2dff7c01 --- /dev/null +++ b/TestGUI/FolderWatcher.vb @@ -0,0 +1,31 @@ +Imports System.ComponentModel +Imports System.IO +Imports DigitalData.Modules.Filesystem +Imports DigitalData.Modules.Logging + +Public Class FolderWatcher + + Private _LogConfig As LogConfig + Private _Watcher As FileWatcher + + Public Sub FileCreated(_sender As Object, _e As FileSystemEventArgs) + ListBox1.Items.Add($"File created: {_e.FullPath}") + End Sub + + Public Sub FileChanged(_sender As Object, _e As FileSystemEventArgs) + ListBox1.Items.Add($"File changed: {_e.FullPath}") + End Sub + + Private Sub FolderWatcher_Load(sender As Object, e As EventArgs) Handles Me.Load + _LogConfig = New LogConfig(LogConfig.PathType.CurrentDirectory, Nothing, "MAIN") + _Watcher = New FileWatcher(_LogConfig, "E:\Watcher") + + _Watcher.Add("*.*") + + _Watcher.Start() + End Sub + + Private Sub FolderWatcher_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + _Watcher.Stop() + End Sub +End Class \ No newline at end of file diff --git a/TestGUI/My Project/Application.Designer.vb b/TestGUI/My Project/Application.Designer.vb index abde74e4..b30e1dba 100644 --- a/TestGUI/My Project/Application.Designer.vb +++ b/TestGUI/My Project/Application.Designer.vb @@ -1,10 +1,10 @@ '------------------------------------------------------------------------------ ' -' This code was generated by a tool. -' Runtime Version:4.0.30319.42000 +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:4.0.30319.42000 ' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. ' '------------------------------------------------------------------------------ @@ -13,15 +13,15 @@ Option Explicit On Namespace My - - 'NOTE: This file is auto-generated; do not modify it directly. To make changes, - ' or if you encounter build errors in this file, go to the Project Designer - ' (go to Project Properties or double-click the My Project node in - ' Solution Explorer), and make changes on the Application tab. + + 'HINWEIS: Diese Datei wird automatisch generiert und darf nicht direkt bearbeitet werden. Wenn Sie Änderungen vornehmen möchten + ' oder in dieser Datei Buildfehler auftreten, wechseln Sie zum Projekt-Designer. + ' (Wechseln Sie dazu zu den Projekteigenschaften, oder doppelklicken Sie auf den Knoten "Mein Projekt" im + ' Projektmappen-Explorer). Nehmen Sie auf der Registerkarte "Anwendung" entsprechende Änderungen vor. ' Partial Friend Class MyApplication - - _ + + _ Public Sub New() MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) Me.IsSingleInstance = false @@ -29,10 +29,10 @@ Namespace My Me.SaveMySettingsOnExit = true Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses End Sub - - _ + + _ Protected Overrides Sub OnCreateMainForm() - Me.MainForm = Global.TestGUI.Form1 + Me.MainForm = Global.TestGUI.FolderWatcher End Sub End Class End Namespace diff --git a/TestGUI/My Project/Application.myapp b/TestGUI/My Project/Application.myapp index 1243847f..d87a023e 100644 --- a/TestGUI/My Project/Application.myapp +++ b/TestGUI/My Project/Application.myapp @@ -1,11 +1,10 @@  true - Form1 + FolderWatcher false 0 true 0 - 0 true - + \ No newline at end of file diff --git a/TestGUI/TestGUI.vbproj b/TestGUI/TestGUI.vbproj index 62c78d92..e0b1a238 100644 --- a/TestGUI/TestGUI.vbproj +++ b/TestGUI/TestGUI.vbproj @@ -93,6 +93,12 @@ + + FolderWatcher.vb + + + Form + Form @@ -117,6 +123,9 @@ + + FolderWatcher.vb + Form1.vb @@ -145,6 +154,10 @@ + + {991d0231-4623-496d-8bd0-9ca906029cbc} + Filesystem + {3dcd6d1a-c830-4241-b7e4-27430e7ea483} LookupControl