http://www.pronix.de -> Forum -> C-Programmieren

Unterseiten

Forum: C-Programmieren

Moderatoren: juergen, Martin Conrad

Thema: [EDIT] - FileSystemEventHandler Part 2.0

  • (nur registrierte Mitglieder)
Tagchen Zusammen... Dank des Hinweises auf die MSDN Lib zum Thema "Obtaining Directory..." habe ich zwischenzeitlich erfasst, wie ein FileSystemWatcher mittels Win32-Api prinzipiell aussehen kann.

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
 
Die FILE_NOTIFY_INFORMATION enthält doch sowohl die Informationen was passiert ist - Action Komponente - als auch welche Datei es betrifft - FileNameLength & FileName. Zu beachten ist lediglich, dass in FileName eine NICHT Null terminierte wchar_t Zeichenkette steht, da dir die Länge aber via FileNameLength explizit mitgeteilt wird ist das doch kein Problem. Von der Art und Weise wie FileName definiert ist, darf man sich nicht verwirren lassen. Struktur und Zeichenkette werden zur Vermeidung von Speicherfragmentierung in einen Block zusammengefasst.

Den Dateinamen solltest Du in etwa so

printf ("Datei: %.*ls\n", fileNotifyInfo.FileNameLength, fileNotifyInfo.FileName );

ausgeben können.
 
Langsam verzweifle ich an dieser simplen, aber scheinbar für mich zu komplizierten Aufgabe.
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?????


 
Hi,
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.
 
Super...Vielen Dank für die Hilfestellung!

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 Grafik: Smilie Zwinker

Gruß Matthias
 
  • (nur registrierte Mitglieder)