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

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
oO0XX0Oo
Beiträge: 55
Registriert: 21.07.2017 22:36

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

Beitrag von oO0XX0Oo »

Super cool, vielen Dank für das Hinzufügen dieses features! :lurk:
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
oO0XX0Oo
Beiträge: 55
Registriert: 21.07.2017 22:36

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

Beitrag 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...
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

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

Beitrag 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.
PureBasic 6.04 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​​
oO0XX0Oo
Beiträge: 55
Registriert: 21.07.2017 22:36

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

Beitrag 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...
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

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

Beitrag 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)
PureBasic 6.04 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​​
oO0XX0Oo
Beiträge: 55
Registriert: 21.07.2017 22:36

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

Beitrag 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? >:)
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

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

Beitrag 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.
PureBasic 6.04 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​​
oO0XX0Oo
Beiträge: 55
Registriert: 21.07.2017 22:36

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

Beitrag 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)
Antworten