FileSystemWatcher Event durch Ordner oder Datei ermitteln

  • VB.NET

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

    FileSystemWatcher Event durch Ordner oder Datei ermitteln

    Hallo,

    Ich überwache mit dem FileSystemWatcher einen Ordner auf Änderungen.

    Private WatchFolder As IO.FileSystemWatcher
    WatchFolder = New IO.FileSystemWatcher("C:\test")
    WatchFolder.IncludeSubdirectories = True
    WatchFolder.NotifyFilter = IO.NotifyFilters.FileName
    WatchFolder.NotifyFilter = IO.WatcherChangeTypes.All
    AddHandler WatchFolder.Changed, AddressOf LogChange
    AddHandler WatchFolder.Created, AddressOf LogChange
    AddHandler WatchFolder.Deleted, AddressOf LogDelete
    AddHandler WatchFolder.Renamed, AddressOf LogRename
    WatchFolder.EnableRaisingEvents = True

    Private Sub LogChange(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs)
    ...
    End Sub

    Private Sub LogDelete(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs)
    ...
    End Sub

    Soweit alles OK.
    Jetzt muss ich ermitteln, ob das Ereignis von einer Datei oder einem Ordner erzeugt wurde.
    Wurde die Datei oder der Ordner neu erstellt, geht das noch. Wird jedoch eine Datei oder ein Ordner gelöscht, und somit das "LogDelete" Event aufgerufen, habe ich ein Problem.
    Meine Frage daher an die Profis:
    Wie kann ich ermitteln, ob das WatchFolder.Delete - Ereignis von einer Datei oder einem Ordner ausgelöst wurde?

    MfG
    Bernd
    Willkommen im Forum!
    Als erstes möchte ich dich darauf Hinweisen, das wir hier einen BB-Code für VB-Code haben:
    Diesen macht du so:

    Quellcode

    1. [code=vbnet][/vb]

    [vb]'Dein Code[/code]

    Zu deiner Frage: Du musst Überprüfen, ob e.FullName ein Ordner oder eine Datei ist.

    VB.NET-Quellcode

    1. Private Sub FileSystemWatcher1_Deleted(sender As Object, e As IO.FileSystemEventArgs) Handles FileSystemWatcher1.Deleted
    2. If File.Exists(e.FullPath) AndAlso Not Directory.Exists(e.FullPath) Then
    3. 'Eine Datei
    4. ElseIf Not File.Exists(e.FullPath) AndAlso Directory.Exists(e.FullPath) Then
    5. 'Ein Ordner
    6. Else
    7. 'Datei und Ordner besitzen geleichen Namen: Geht nicht
    8. End If
    9. End Sub
    Grüße,
    Lukas

    Fragen über Themen im Forum per Konversation werden gelöscht und die Absender blockiert...
    Tja nur leider funktioniert das mit dem Exists nicht, wenn das Event aufgrund eines Löschvorgangs ausgelöst wurde.
    Auf Anhieb würde mir auch nur einfallen, auf das Vorhandensein einer Endung in e.FullName zu prüfen, das ist aber keine 100%ige Lösung, denn Dateien brauchen nicht zwangsläufig eine Endung und Ordner können auch Punkte enthalten.
    @Artentus: Ah ja, hast recht
    Mir würde jetzt noch einfallen, alle Dateien indexieren, und nach jedem Delete-Event den Ordner nochmals zu durchsuchen und mit der letzten Suche vergleichen und die Daten neu indexieren.
    Das ist aber nicht empfehlenswert.
    Grüße,
    Lukas

    Fragen über Themen im Forum per Konversation werden gelöscht und die Absender blockiert...