Ik ben bezig met een programma in VB.NET. Om een bepaalde taak uit te voeren moet dit programma een directory, subdirectories en files in deze subdirectories in de gaten houden. Dit heb ik voor 90% voor elkaar gekregen zoals ik het wil, maar nu echter het volgende probleem; Ik wil niet dat de Watcher zich iets aantrekt van bestanden in de hoofddirectory, enkel in de subdirectories. Even wat code om het geheel te illustreren:
Alles werkt naar behoren, enkel wanneer ik dus een file aanmaak in de hoofddirectory ("F:\blaatschaap") wordt het "Changed"-event uitgevoerd en krijg ik een probleem hiermee in regel 43 omdat e.FullPath verwijst naar een file in plaats van een directory.
Met een NotifyFilter is dit niet te omzeilen want als ik daarvoor "DirectoryName" opgeef, zorgt 'ie niet meer dat de subdirs verwijderd worden wanneer alle files hierin gedelete zijn. (en waarschijnlijk delete 'ie nu ook de hoofddir als ik daaruit alle files verwijder).
Iemand een oplossing toevallig? MSDN biedt ook al geen oplossing
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Scan for MP3 directories already existing 'TODO: add code to retrieve rootdir from configuration file Dim sRootDir, sDir As String Dim sDirectories As Array sRootDir = "F:\blaatschaap" 'Change "F:\blaatschaap" to rootdir from config file sDirectories = Directory.GetDirectories(sRootDir) For Each sDir In sDirectories 'Check if directory contains any files, if not, delete it, else add it to lsbQue If Directory.GetFiles(sDir).Length = 0 Then MsgBox("Delete dir " & sDir) 'Directory.Delete(sDir) Else sDir = PathPart(sDir) lsbQue.Items.Add(sDir) End If Next 'Watch for creation of new directories Dim DirWatcher As New FileSystemWatcher DirWatcher.Path = "F:\blaatschaap" 'ReadConfigFile() 'add arguments for mp3 root directory 'DirWatcher.NotifyFilter = NotifyFilters.DirectoryName 'Not working correctly in case of .Changed 'Update lsbQue when needed AddHandler DirWatcher.Created, AddressOf OnDirChange AddHandler DirWatcher.Deleted, AddressOf OnDirChange AddHandler DirWatcher.Changed, AddressOf OnDirChange AddHandler DirWatcher.Renamed, AddressOf OnDirRename 'Enable the watcher to raise events DirWatcher.EnableRaisingEvents = True End Sub Private Sub OnDirChange(ByVal sender As Object, ByVal e As FileSystemEventArgs) Select Case e.ChangeType Case WatcherChangeTypes.Created 'Add item to the lsbQue when directory is created lsbQue.Items.Add(e.Name) Case WatcherChangeTypes.Deleted 'Remove item from lsbQue when directory is deleted lsbQue.Items.Remove(e.Name) Case WatcherChangeTypes.Changed 'Check if directory is empty, if so, delete it If Directory.GetFiles(e.FullPath).Length = 0 Then Directory.Delete(e.FullPath) lsbQue.Items.Remove(e.Name) End If End Select End Sub |
Alles werkt naar behoren, enkel wanneer ik dus een file aanmaak in de hoofddirectory ("F:\blaatschaap") wordt het "Changed"-event uitgevoerd en krijg ik een probleem hiermee in regel 43 omdat e.FullPath verwijst naar een file in plaats van een directory.
Met een NotifyFilter is dit niet te omzeilen want als ik daarvoor "DirectoryName" opgeef, zorgt 'ie niet meer dat de subdirs verwijderd worden wanneer alle files hierin gedelete zijn. (en waarschijnlijk delete 'ie nu ook de hoofddir als ik daaruit alle files verwijder).
Iemand een oplossing toevallig? MSDN biedt ook al geen oplossing