Dateiüberwachung mit oder ohne Filesystemwatcher

AccAkut

Grünschnabel
Guten Tag,

der Filesystemwatcher an sich ist ja ne nette Sache und nimmt einem auch gut Arbeit ab. Aber ich wäre ja nicht ich wenn ich nicht mal wieder extrawünsche hätte.
Und zwar wie kann man de Ding den beibringen dass er Meldung macht sofern mehrere Dateien gleichzeitig in einen Ordner kopiert wurden. Mein Filesystemwatcher gibt immer nur den ersten neuen Dateinamen aus.

Oder hat vielleicht jemanand ne ganz andere Idee mit einem Timer und ne rekursiven Ordnerdurchforstung... (ist mir grad so eingefallen ;-))

Man könnte das allerdings bestimmt auch über einen Thread und Filestreams, das bekomm ich aber bestimmt nicht hin :-(, realisieren.
Ich spinn mal wieder rum.

Wie schauts hat jemand ne Idee?


Vielen Dank

P.S. Die neuen Dateien sollen dann nacheinander eingelesen werden. Das funktioniert supi solange ich nur die Dateiennamen schön einzeln getrennt vorkaue...
 
Wenn du den FileSystemWatcher auf created stellst, sollten dann doch alle Dateien nacheinander per Event geworfen werden, oder?
 
Hi Norbert,

ich habs jetzt! Und nein ganz so einfach war's nicht, musste threadsicher sein und die Handles müssen stimmen.

Aber hier für die Gemeinde:


Code:
Private Sub Watch_Created(ByVal sender As Object, _
ByVal e As System.IO.FileSystemEventArgs) Handles Watch.Created

        ' Der Liste den neuen Dateinamen hinzufügen.

        Console.WriteLine(e.FullPath & e.ChangeType.ToString())

        filename = e.Name
        filepath = e.FullPath
        filechange = e.ChangeType
        SetText(filepath)

Ganz wichtig ist es den FileSystemWatcher Private zu initialisieren sonst funktioniert der Handle bei den Aurufen nicht. Und in der Tat in dieser Form kann man dann auch Rename etc. pp deklarieren.

Ein Problem was dabei entsteht ist die Threadsicherheit zum Beispiel schon mit ner einfachen Textbox. Das bekommt man mit ner kleinen Funtion:

Code:
'Im Header

Delegate Sub SetTextCallback(ByVal [text] As String)

Private Sub SetText(ByVal [text] As String)

        ' Vergleicht die Thread-IDs und schaut nach der 
        ' Zugehörigkeit
        ' Mein die gleich sind gibt er true zurück
        If Me.TextBox.InvokeRequired Then
            Dim d As New SetTextCallback(AddressOf SetText)
            Me.Invoke(d, New Object() {[text]})
        Else
            Me.TextBox.Text = [text]
        End If
    End Sub

und der Invokegeschichte weg. MSDN sei dank ;-)

Die Filter können ganz normal über ne Initalisierung verwendet werden. Und über die Handles versteht er jetzt sogar wenn mehrere Dateien reinkommen.
Jetzt muss ich nur noch die SetText auf Arrayfähigkeit ummodeln, dar in der Textbox im Gegensatz zur Console in der jetzigen Form trotzdem nur die erste Datei angezeigt wird.

viel Spass damit !
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück