SuperviseDirectory() & GetKnownFolder() [Module][WIN]
Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]
Super cool, vielen Dank für das Hinzufügen dieses features!
Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]
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]
Das Verändern von Dateinamen sollte eigentlich abgeckt sein, oder?
Scheint mit v1.02 zur Zeit nicht der Fall zu sein...
Neue Datei anlegen wird gemeldet, Datei löschen auch, aber eine Dateinamensveränderung nicht?
Scheint mit v1.02 zur Zeit nicht der Fall zu sein...
Code: Alles auswählen
StartSuperviseDirectory("R:\a\", 0, #False)
Die Datei wurde nach dem Anlegen in "modified_New Textfile.txt" umbenannt...File New Textfile.txt was created
File modified_New Textfile.txt has been deleted
Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]
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.
#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]
Das hatte ich für mein Projekt gar nicht gebraucht.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.
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
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"
per StringField() bequem auf die Namen zugreifen kann. Da der ":" nicht in Filenamen vorkommen darf,
dürfte es da auch keine Komplikationen geben.
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom
Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]
Danke für die zusätzlichen Änderungen
Nun ein kleines Problemchen...
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...
Nun ein kleines Problemchen...
Code: Alles auswählen
StartSuperviseDirectory("R:\a\", 0, #False)
StartSuperviseDirectory("R:\b\", 0, #False)
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]
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)
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)
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom
Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]
Vielen dank (wieder mal...)!
Eine Sache, die hier ... komisch ... ist:
Wenn ich im sourcecode per ShowMemoryViewer(EventData(), 62),
String View (Unicode) einen Blick drauf werfe, sieht man das hier:
Woher kommt denn das hübsche chinesische Schriftzeichen hier?
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
String View (Unicode) einen Blick drauf werfe, sieht man das hier:
Code: Alles auswählen
New Textfile [01].txt묉:ddd.txt[NULL]
Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]
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
liegt.
Ändere das mal so ab :
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.
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)
Ändere das mal so ab :
Code: Alles auswählen
FileAction_File = PeekS(@buffer\Filename, buffer\FileNameLength, #PB_Unicode)
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.
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom
Re: SuperviseDirectory() & GetKnownFolder() [Module][WIN]
Das Austauschen der Zeile ändert leider nichts...
Hier noch mal eine Reihe von renames
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)
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
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)