Ich benutze ReadDirectoryChangesW (Windows API) asynchron in Kombination mit GetQueuedCompletionStatus. Wie kann ich einen möglichen Pufferüberlauf erkennen, um zu verstehen, dass mindestens ein Dateisystemänderungsereignis verloren gegangen ist?
Antworten
Zu viele Anzeigen?Wenn Sie ReadDirectoryChangesW
asynchron verwenden, erhalten Sie die erste Gruppe von Ereignissen, dann müssen Sie sie erneut aufrufen, um weitere Ereignisse zu erhalten. Es ist kein Fehler, mehr Ereignisse zu haben als in Ihrem Puffer passen. Wenn es mehr Ereignisse gibt, als in den OS-Ebene-Puffer passen, handelt es sich um den Fehlerfall, den Sie wie folgt herausfinden:
- Ein Ereignis tritt auf.
- Die asynchrone Operation, die durch
ReadDirectoryChangesW
gestartet wurde, wird erfolgreich abgeschlossen. Ihr Puffer ist gefüllt, Ihr Ereignishandle ist gesetzt oder der IOCP wird ausgelöst. - Zusätzliche Ereignisse treten auf, die im OS-Ebene-Puffer gespeichert sind.
- Weitere zusätzliche Ereignisse treten auf, die den OS-Ebene-Puffer überlaufen. Dies ändert nicht den Status der überlappenden Operation, die bereits in Schritt 2 erfolgreich war.
- Sie warten auf das Ereignishandle oder verarbeiten das IOCP und entdecken den abgeschlossenen überlappenden Aufruf.
- Sie rufen
ReadDirectoryChangesW
erneut auf, um eine asynchrone überlappende Operation zu starten und nach Ereignissen zu suchen, die seit Schritt 2 aufgetreten sind. Dieser Aufruf schlägt synchron fehl, mitGetLastError() == ERROR_NOTIFY_ENUM_DIR
, oder gelingt mitdwBytesTransferred == 0
, da die Dokumentation sagt, dass dies auch bedeutet, das Verzeichnis erneut aufzulisten
Wenn die Anzahl der übertragenen Bytes null beträgt, war der Puffer entweder zu groß für das System zur Allokation oder zu klein, um detaillierte Informationen zu allen Änderungen zu liefern, die im Verzeichnis oder Unterbaum aufgetreten sind. In diesem Fall sollten Sie die Änderungen berechnen, indem Sie das Verzeichnis oder den Unterbaum aufzählen.
Sie können Ihre Erkennungen auf diese Weise möglicherweise nicht durchführen, aber hier ist ein großartiges Tutorial, das helfen könnte.
Sie könnten auch die Antwort auf diese andere Frage überprüfen.
Es scheint, dass laut hier kein solcher Fehlercode asynchron zurückgegeben wird.
Vorschlag: Überwachen Sie Änderungen synchron, aber in einem dedizierten Thread, und achten Sie auf ERROR_NOTIFY_ENUM_DIR
.