[VB.NET] FileSystemWatcher dilemma

Pagina: 1
Acties:

  • bennierex
  • Registratie: April 2001
  • Laatst online: 16-08 23:24
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:
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 :(