Forum: C-Programmieren
Moderatoren: juergen, Martin ConradThema: [EDIT] - FileSystemEventHandler Part 2.0
[EDIT] - FileSystemEventHandler Part 2.0
sw2739 am 28.11.2011 um 01:24
Mein Problem...In meinem Dos_Fensterchen werden alle Änderungen, im Übrigen unter Auslastung ganz hübscher SystemRessourcen, ausgegeben, aber ohne entsprechende Verweise, welche Datei beispielsweise gerade der ChangeNotification ausgesetzt war.
Frage, wie kann ich die Verbindung zwischen Ereignis und Auslöser herstellen?
Derzeitiger Stand meiner Versuche beinhaltet die Funktion ReadDirectoryChangesW i.V.m. der Struktur FILE_NOTIFY_INFORMATION. Liege ich damit schon einigermaßen richtig?
Und gibt es diesbezüglich bessere CodeSamples als diejenigen in der SDK Dokumentation?
Grüße Matthias
Re: FileSystemEventHandler Part 2.0
scusi71 am 28.11.2011 um 10:30
Den Dateinamen solltest Du in etwa so
printf ("Datei: %.*ls\n", fileNotifyInfo.FileNameLength, fileNotifyInfo.FileName );
ausgeben können.
[EDIT] - Re: FileSystemEventHandler Part 2.0
sw2739 am 01.12.2011 um 19:44
Ich habe mittlerweile etliche Varianten ausprobiert und komme immer wieder zu dem selben Ergebnis, nämlich "alles murks".
Hier mal ein Beispiel was läuft, aber nicht die Info ausgibt, die ich gerne hätte.
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
void main(int argc, LPCSTR argv[]){
LPCSTR DirName = argv[1];
HANDLE hDir;
FILE_NOTIFY_INFORMATION strInfo;
DWORD BytesReturned;
hDir = CreateFile (
DirName,
FILE_LIST_DIRECTORY,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL
);
while(ReadDirectoryChangesW(
hDir,
&strInfo,
sizeof(strInfo),
TRUE,
FILE_NOTIFY_CHANGE_CREATION|
FILE_NOTIFY_CHANGE_LAST_ACCESS|
FILE_NOTIFY_CHANGE_LAST_WRITE|
FILE_NOTIFY_CHANGE_SIZE|
FILE_NOTIFY_CHANGE_ATTRIBUTES|
FILE_NOTIFY_CHANGE_FILE_NAME,
&BytesReturned,
NULL,
NULL)){
printf("Notified FileName ... \t%ls\n", strInfo.FileName);
}
}
Wo ist der Fehler?????
Re: FileSystemEventHandler Part 2.0
scusi71 am 02.12.2011 um 09:04
da der Dateiname als Teil der Struktur MIT der Struktur im gleichen Speicher liegt, ist die echte größer der Struktur erst zur Laufzeit bekannt. Du musst hier mit einem Buffer arbeiten der neben der Struktur auch noch´Platz für einen Dateinamen hat. Ersetz strInfo also durch
FILE_NOTIFY_INFORMATION * notifyInfo = malloc ( sizeof (FILE_NOTIFY_INFORMATION) + sizeof(WCHAR) * MAX_PATH );
Natürlich musst du beim Aufruf der ReadDirectoryChangesW Funktion auch den Adress Operator entfernen und die Größe korrekt angeben.
Da der Name nicht NUL terminiert wird musst Du die Länge der Zeichenkette explizit angeben. Allerdings enthält die FileNameLength komponente nicht die länge in WCHAR Zeichen sondern die Länge in Anzahl Bytes, für die Ausgabe musst du also die Bytelänge noch durch die Anzahl der Bytes per WCHAR Teilen.
printf("Notified FileName ... \t%.*ls\n", strInfo->FileNameLength / sizeof (wchar_t), strInfo->FileName);
mit diesen beiden Änderungen sollte es dann gehen.
[EDIT] - Re: FileSystemEventHandler Part 2.0
sw2739 am 02.12.2011 um 18:21
Ich werds gegen Abend ausprobieren. Bei einem hoffentlichen Erfolg werde ich den Code hier posten, damit andere Anfänger nicht ähnliche Martyrien über sich ergehen lassen müssen.
Sollte es widererwartend nicht klappen, macht mein Laptop Bekanntschaft mit dem neuen ServicePack, SP Vorschlaghammer Vers. 3 Kg
Gruß Matthias
