Seite 2 von 4

Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]

Verfasst: 09.03.2018 12:24
von oO0XX0Oo
Super cool, vielen Dank für das Hinzufügen dieses features! :lurk:

Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]

Verfasst: 09.03.2018 15:45
von RSBasic
Mir fällt noch was ein, was wichtig ist: Noch ein Tipp an die User, die den Code von Bisonte erweitert wollen: Bitte unbedingt darauf achten, keinen unnötigen Code und keine weiteren Funktionsaufrufe (z.B. irgendwelche Abfragen ob Dateityp o.ä.) in der ReadDirectoryChangesW-Schleife einzubauen, da sonst die Gefahr besteht, dass erkannte Dateiänderungen "verschluckt" werden. Wenn in der Schleife noch weitere Vorgänge verarbeitet werden, kann nicht mehr sichergestellt werden, dass alle Dateiänderungen erkannt werden. Besonders kritisch bei vielen kleinen Dateien, die z.B. kopiert werden. Bitte unbedingt außerhalb der Schleife machen. Ein PostEvent() reicht aus.

Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]

Verfasst: 09.03.2018 15:59
von oO0XX0Oo
Das Verändern von Dateinamen sollte eigentlich abgeckt sein, oder?

Scheint mit v1.02 zur Zeit nicht der Fall zu sein...

Code: Alles auswählen

StartSuperviseDirectory("R:\a\", 0, #False)
Neue Datei anlegen wird gemeldet, Datei löschen auch, aber eine Dateinamensveränderung nicht?
File New Textfile.txt was created
File modified_New Textfile.txt has been deleted
Die Datei wurde nach dem Anlegen in "modified_New Textfile.txt" umbenannt...

Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]

Verfasst: 09.03.2018 16:03
von RSBasic
Ich habe den Code angeschaut, es ist nicht abgedeckt.
#ILE_ACTION_RENAMED_OLD_NAME und/oder #FILE_ACTION_RENAMED_NEW_NAME fehlen noch.
Damit können auch Dateiumbenennungen festgestellt werden.

Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]

Verfasst: 09.03.2018 18:26
von Bisonte
RSBasic hat geschrieben:Ich habe den Code angeschaut, es ist nicht abgedeckt.
#ILE_ACTION_RENAMED_OLD_NAME und/oder #FILE_ACTION_RENAMED_NEW_NAME fehlen noch.
Damit können auch Dateiumbenennungen festgestellt werden.
Das hatte ich für mein Projekt gar nicht gebraucht.

Edit: Das gestaltet sich irgendwie schwieriger als gedacht.

Es wird anscheinend nur das #FILE_ACTION_RENAME_OLD_NAME aufgerufen als Action.
Aber ich wäre nicht ich, wenn ich mich nicht da durchbeisse :mrgreen:

Durch den buffer\NextEntryOffset konnte ich tatsächlich den neuen Namen auslesen.
Das ganze hab ich nun als einen String per PostEvent gesendet. Der String sieht jetzt so aus :

Code: Alles auswählen

 "OldFilename:NewFilename"
Wie man sieht, ist er einfach mit einem Doppelpunkt getrennt, sodass man (wie im Democode)
per StringField() bequem auf die Namen zugreifen kann. Da der ":" nicht in Filenamen vorkommen darf,
dürfte es da auch keine Komplikationen geben.

Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]

Verfasst: 09.03.2018 21:27
von oO0XX0Oo
Danke für die zusätzlichen Änderungen

Nun ein kleines Problemchen...

Code: Alles auswählen

  StartSuperviseDirectory("R:\a\", 0, #False)
  StartSuperviseDirectory("R:\b\", 0, #False)
Man erstelle in R:\a\ und in R:\b\ eine neue Datei namens "a.txt"

Das Problem: Es wird nur ein Dateiname geliefert (oder in einem tieferliegenden
Unterverzeichnis: Relativer Verzeichnisname + Dateiname). Es ist also nicht
ersichtlich, in welchem überwachten Verzeichnis die Änderung stattgefunden hat,
wenn man mehr als einen Ordner überwacht...

Von daher die Frage ob es alternativ möglich wäre, vollständige Datei-/Verzeichnisnamen
zurückzugeben. Mir ist klar, dass das mit der Renameerkennung (durch den Doppelpunkt
als Trenner) nicht mehr so einfach ist...

Zusätzlich würde ich gerne wissen, ob du es für sinnvoll halten würdest, eine Prozedur
hinzuzufügen, die es einem erlaubt, alle derzeit zur Überwachung registrierten Verzeichnisse
(als Map oder List, in der s_superviseDirectory Struktur sind ja die nötigen Daten hinterlegt)
abzufragen. Das würde das Deregistrieren vereinfachen, wenn man das Ganze dynamisch
machen möchte.
Wobei ich alternativ auch eine Prozedur schreiben könnte, die die Registrierung
macht und dabei selber eine Map oder List befüllt, die man dann wieder zur Deregistrierung heranziehen
kann...

Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]

Verfasst: 09.03.2018 23:38
von Bisonte
Das mit der Map nach aussen ist schon sinnvoll, allerdings wollte ich "DAU" Sicherheit herstellen, weil falls man schreibend darauf zugreift, gibts Chaos wegen dem Thread.

Ich hab da aber schon eine Idee wie man das Identifizieren des Threads erreichen kann.
Ich habe ja noch die "EventGadget()" Variable frei. Dort koennte ich jetzt die ID, die beim StartSuperViseDirectory() zurückgegeben wird,
eintragen. Den Rest muss dann der User bewerkstelligen.

Ich hab da dann mal die Version 1.04 fertig ;)

Die Prozedur StartSuperViseDirectory() gibt eine ID zurück (es ist die Speicheradresse des MapElements).
Diese ID ist zur Identifizierung der einzelnen Verzeichnisse nötig (mehr oder weniger)

Mit GetSuperViseDirectory(ID) kann man mit dieser ID das Verzeichnis bekommen, das damit überwacht wird.
Die ID kann beim Event per "EventGadget()" erfragt werden.

Siehe im Democode in der EventProzedur. (Dort muss man jetzt gerade zwar nicht die ID irgendwo zwischenspeichern,
sollte aber das Prinzip der Handhabung verdeutlichen)

Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]

Verfasst: 10.03.2018 00:29
von oO0XX0Oo
Vielen dank (wieder mal...)!

Eine Sache, die hier ... komisch ... ist:

Code: Alles auswählen

File New Textfile [01].txt was created in Directory R:\a\
The File : New Textfile [01].txt� was renamed to ddd.txt
Wenn ich im sourcecode per ShowMemoryViewer(EventData(), 62),
String View (Unicode) einen Blick drauf werfe, sieht man das hier:

Code: Alles auswählen

New Textfile [01].txt묉:ddd.txt[NULL]
Woher kommt denn das hübsche chinesische Schriftzeichen hier? >:)

Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]

Verfasst: 10.03.2018 02:26
von Bisonte
Ich probier hier rum aber ich kann den Fehler nicht reproduzieren.....

Welche PBVersion ? Und x86 oder x64 ? und welches Windows ?

Aber unter Umständen kann es sein, dass es an der Zeile

Code: Alles auswählen

FileAction_File = PeekS(@buffer\Filename, -1, #PB_Unicode)
liegt.
Ändere das mal so ab :

Code: Alles auswählen

FileAction_File = PeekS(@buffer\Filename, buffer\FileNameLength, #PB_Unicode)
und teile das Ergebnis mit.

MSDN sagt nämlich das im Filename kein abschliessendes 0Byte dran ist. Könnte also sein, dass das dann
der Fehler wäre.

Wie gesagt ich krieg das nicht hin, das da ein Zeichen zuviel dran hängt.

Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]

Verfasst: 10.03.2018 09:33
von oO0XX0Oo
Das Austauschen der Zeile ändert leider nichts...

Hier noch mal eine Reihe von renames

Code: Alles auswählen

The File : ddd.txt was renamed to ccc.txt
The File : ccc.txt was renamed to bbb.txt
The File : bbb.txt was renamed to aaa.txt
The File : aaa.txt was renamed to b.txt
The File : b.txtI was renamed to c.txt
The File : c.txt was renamed to d.txt
The File : d.txt was renamed to e.txt
The File : e.txt� was renamed to f.txt
Es tritt also nicht mal immer auf, sondern nur vereinzelt. In diesem Fall "nur" 2 mal...
Beim b.txtI ist es offensichtlich sogar nur ein ASCII Zeichen, beim e.txt dann ein Unicode

Ich verwende hier PB 5.62 x86 auf einem 64-bit OS (Windows Server 2012 R2 U3)