<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ReadDirectoryChangesW raff ich nicht...]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab ein Problem mit dem Einsatz von ReadDirectoryChangesW. Ich muß dazu anmerken, dass ich aus der BCB-Fraktion stamme und so weit als möglich immer einen großen Bogen um die WinAPI gemacht habe... Erklärungen also bitte für Dummies.</p>
<p>Folgendes habe ich mir aus diversen Quellen zusammengefrickelt und läuft in einem (Borland-spezifischen) Thread:</p>
<p>Header:</p>
<pre><code class="language-cpp">class TWatchThread : public TThread
{
private:
	int Counter;
	HANDLE FDirectoryHandle;
	DWORD FBytesWritten, FNotifyFilter, bufsize;
	FILE_NOTIFY_INFORMATION FNotificationBuffer;
	TOverlapped FOverlapped;
	char* fInfo;
	void __fastcall EventFired(void);
	AnsiString asFileName;
protected:
	void __fastcall Execute();
public:
	__fastcall TWatchThread(bool CreateSuspended);
};
</code></pre>
<p>CPP:</p>
<pre><code class="language-cpp">__fastcall TWatchThread::TWatchThread(bool CreateSuspended)
	: TThread(CreateSuspended)
{
	FDirectoryHandle = 0;
	ZeroMemory(&amp;FOverlapped, sizeof(FOverlapped));

	bufsize = sizeof(FILE_NOTIFY_INFORMATION) + MAX_PATH * sizeof(wchar_t);
	fInfo = new char[FBytesWritten];
}

void __fastcall TWatchThread::Execute()
{
	Counter = 0;
	AnsiString asPath = &quot;c:\\scanner&quot;;

	FNotifyFilter = FILE_NOTIFY_CHANGE_LAST_WRITE;
	FDirectoryHandle = CreateFile(asPath.c_str(),
											FILE_LIST_DIRECTORY, FILE_SHARE_READ |
											FILE_SHARE_WRITE | FILE_SHARE_DELETE,
											NULL,
											OPEN_EXISTING,
											FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
											0);
	if (FDirectoryHandle == INVALID_HANDLE_VALUE)
	{
		FDirectoryHandle = 0;
		ShowMessage(SysErrorMessage(GetLastError()));
		Terminate();
	}

	while (!Terminated)
	{
		ZeroMemory(&amp;FNotificationBuffer, sizeof(FNotificationBuffer));
		ZeroMemory(fInfo, FBytesWritten);

		ReadDirectoryChangesW(FDirectoryHandle, fInfo, bufsize,	false, FNotifyFilter, &amp;FBytesWritten, &amp;FOverlapped, NULL);
		if(WaitForSingleObject(FDirectoryHandle, 1000) == WAIT_OBJECT_0)
		{
			++Counter;
//			asFileName = AnsiString(((FILE_NOTIFY_INFORMATION*) fInfo)-&gt;FileName);
			Synchronize(EventFired);
		}
	}
	if (FDirectoryHandle)
		CloseHandle(FDirectoryHandle);
//	delete[] fInfo;
}
</code></pre>
<p>Das läuft so prinzipiell...</p>
<p>Allerdings verstehe ich nicht, wozu FOverlapped gut sein soll. Ohne funktioniert es jedoch nicht (auch wenn ich FILE_FLAG_OVERLAPPED bei der Erzeugung des Directory Handles weglasse.). MSDN und SDK-Hilfe haben nur noch mehr Fragen aufgeworfen... Brauch ich das FOverlapped wirklich? Wenn ja, wofür? Wenn nicht, wie krieg ich es weg?</p>
<p>Das mit der bufsize habe ich hier aus einem Beitrag von Flenders. Verstehen tu ich es nicht, da ja mehrere Dateien in einer FILE_NOTIFY_INFORMATION Struktur stehen können. Muß ich da einfach sicher stellen, dass genügend Speicher reserviert ist, oder hat es einen tieferen Sinn, warum die bufsize so ermittelt wird?</p>
<p>Das Ergebnis ist fast richtig, aber das Ende des Dateinamens wird nicht korrekt erkannt. Es ist immer mindestens ein Zeichen zuviel. Im wchar_t FileName steht z.B. 'test.txt/x7865'. Muß ich zwangsläufig FILE_NOTIFY_INFORMATION::FileNameLength verwenden?<br />
Wie komme ich an einen möglichen zweiten Dateinamen in der Struktur? Einfach einen weiteren Zeiger erstellen und den FILE_NOTIFY_INFORMATION::NextEntryOffset hinzuaddieren?</p>
<p>Schon mal vielen Dank im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/165702/readdirectorychangesw-raff-ich-nicht</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 03:32:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/165702.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Nov 2006 10:56:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ReadDirectoryChangesW raff ich nicht... on Wed, 22 Nov 2006 10:56:30 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab ein Problem mit dem Einsatz von ReadDirectoryChangesW. Ich muß dazu anmerken, dass ich aus der BCB-Fraktion stamme und so weit als möglich immer einen großen Bogen um die WinAPI gemacht habe... Erklärungen also bitte für Dummies.</p>
<p>Folgendes habe ich mir aus diversen Quellen zusammengefrickelt und läuft in einem (Borland-spezifischen) Thread:</p>
<p>Header:</p>
<pre><code class="language-cpp">class TWatchThread : public TThread
{
private:
	int Counter;
	HANDLE FDirectoryHandle;
	DWORD FBytesWritten, FNotifyFilter, bufsize;
	FILE_NOTIFY_INFORMATION FNotificationBuffer;
	TOverlapped FOverlapped;
	char* fInfo;
	void __fastcall EventFired(void);
	AnsiString asFileName;
protected:
	void __fastcall Execute();
public:
	__fastcall TWatchThread(bool CreateSuspended);
};
</code></pre>
<p>CPP:</p>
<pre><code class="language-cpp">__fastcall TWatchThread::TWatchThread(bool CreateSuspended)
	: TThread(CreateSuspended)
{
	FDirectoryHandle = 0;
	ZeroMemory(&amp;FOverlapped, sizeof(FOverlapped));

	bufsize = sizeof(FILE_NOTIFY_INFORMATION) + MAX_PATH * sizeof(wchar_t);
	fInfo = new char[FBytesWritten];
}

void __fastcall TWatchThread::Execute()
{
	Counter = 0;
	AnsiString asPath = &quot;c:\\scanner&quot;;

	FNotifyFilter = FILE_NOTIFY_CHANGE_LAST_WRITE;
	FDirectoryHandle = CreateFile(asPath.c_str(),
											FILE_LIST_DIRECTORY, FILE_SHARE_READ |
											FILE_SHARE_WRITE | FILE_SHARE_DELETE,
											NULL,
											OPEN_EXISTING,
											FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
											0);
	if (FDirectoryHandle == INVALID_HANDLE_VALUE)
	{
		FDirectoryHandle = 0;
		ShowMessage(SysErrorMessage(GetLastError()));
		Terminate();
	}

	while (!Terminated)
	{
		ZeroMemory(&amp;FNotificationBuffer, sizeof(FNotificationBuffer));
		ZeroMemory(fInfo, FBytesWritten);

		ReadDirectoryChangesW(FDirectoryHandle, fInfo, bufsize,	false, FNotifyFilter, &amp;FBytesWritten, &amp;FOverlapped, NULL);
		if(WaitForSingleObject(FDirectoryHandle, 1000) == WAIT_OBJECT_0)
		{
			++Counter;
//			asFileName = AnsiString(((FILE_NOTIFY_INFORMATION*) fInfo)-&gt;FileName);
			Synchronize(EventFired);
		}
	}
	if (FDirectoryHandle)
		CloseHandle(FDirectoryHandle);
//	delete[] fInfo;
}
</code></pre>
<p>Das läuft so prinzipiell...</p>
<p>Allerdings verstehe ich nicht, wozu FOverlapped gut sein soll. Ohne funktioniert es jedoch nicht (auch wenn ich FILE_FLAG_OVERLAPPED bei der Erzeugung des Directory Handles weglasse.). MSDN und SDK-Hilfe haben nur noch mehr Fragen aufgeworfen... Brauch ich das FOverlapped wirklich? Wenn ja, wofür? Wenn nicht, wie krieg ich es weg?</p>
<p>Das mit der bufsize habe ich hier aus einem Beitrag von Flenders. Verstehen tu ich es nicht, da ja mehrere Dateien in einer FILE_NOTIFY_INFORMATION Struktur stehen können. Muß ich da einfach sicher stellen, dass genügend Speicher reserviert ist, oder hat es einen tieferen Sinn, warum die bufsize so ermittelt wird?</p>
<p>Das Ergebnis ist fast richtig, aber das Ende des Dateinamens wird nicht korrekt erkannt. Es ist immer mindestens ein Zeichen zuviel. Im wchar_t FileName steht z.B. 'test.txt/x7865'. Muß ich zwangsläufig FILE_NOTIFY_INFORMATION::FileNameLength verwenden?<br />
Wie komme ich an einen möglichen zweiten Dateinamen in der Struktur? Einfach einen weiteren Zeiger erstellen und den FILE_NOTIFY_INFORMATION::NextEntryOffset hinzuaddieren?</p>
<p>Schon mal vielen Dank im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1179114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1179114</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 22 Nov 2006 10:56:30 GMT</pubDate></item><item><title><![CDATA[Reply to ReadDirectoryChangesW raff ich nicht... on Wed, 22 Nov 2006 12:45:12 GMT]]></title><description><![CDATA[<p>Ok, dass ich den Dateinamen nicht korrekt auslesen konnte, war ein dummer Fehler. Ich hab beim letzten Umstricken vergessen die Zeilen 8 und 32 zu ändern. Dort gehört natürlich bufsize und nicht FBytesWritten hin.</p>
<pre><code class="language-cpp">fInfo = new char[bufsize];
ZeroMemory(fInfo, bufsize);
</code></pre>
<p>Dafür hab ich jetzt noch festgestellt, dass der Event teilweise mehrfach gefeuert wird? Ist das normal?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1179212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1179212</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 22 Nov 2006 12:45:12 GMT</pubDate></item><item><title><![CDATA[Reply to ReadDirectoryChangesW raff ich nicht... on Thu, 23 Nov 2006 12:05:50 GMT]]></title><description><![CDATA[<p>Keine Antwort ist auch eine Antwort... Da es auch keine Kommentare oder Nachfragen gegeben hat, kann ich davon ausgehen, dass hier einfach die Kompetenz fehlt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1179912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1179912</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 23 Nov 2006 12:05:50 GMT</pubDate></item><item><title><![CDATA[Reply to ReadDirectoryChangesW raff ich nicht... on Thu, 23 Nov 2006 13:09:37 GMT]]></title><description><![CDATA[<p>nimm doch was fertiges: <a href="http://www.codeproject.com/file/directorychangewatcher.asp" rel="nofollow">http://www.codeproject.com/file/directorychangewatcher.asp</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1179963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1179963</guid><dc:creator><![CDATA[&#x27;net&#x27;]]></dc:creator><pubDate>Thu, 23 Nov 2006 13:09:37 GMT</pubDate></item></channel></rss>