Wie benachrichtigt werden von Datei / Verzeichnis-Änderung in C / C ++, ideal POSIX mit

StackOverflow https://stackoverflow.com/questions/61253

  •  09-06-2019
  •  | 
  •  

Frage

Das Thema sagt alles - in der Regel einfach und Cross-Plattform-Weg, intelligent abzufragen. Aber jedes OS hat einige Mittel ohne Polling zu benachrichtigen. Ist es möglich, in einem einigermaßen Cross-Plattform-Weg? (Ich kümmere mich nur wirklich über Windows und Linux, aber ich benutze mac, also dachte ich, Posix helfen kann?)

War es hilfreich?

Lösung

Linux-Benutzer können verwenden inotify

  

inotify ist ein Linux-Kernel-Subsystem   dass bietet Dateisystemereignis   Benachrichtigung.

Einige Leckereien für Windows Fellows:

Andere Tipps

Die Qt-Bibliothek hat eine QFileSystemWatcher Klasse, die Cross-Plattform-Benachrichtigungen bietet, wenn eine Datei ändert. Auch wenn Sie nicht Qt verwenden, weil die Quelle zur Verfügung steht können Sie einen Blick auf sie als eine Probe haben für Ihre eigene Implementierung. Qt gibt es unterschiedliche Implementierungen für Windows, Linux und Mac.

Es gibt File System Events API als von Leopard.

Ich glaube nicht, POSIX sich Einrichtungen für das hat. In der Nähe von Cross-Plattform ich gesehen habe, ist FAM , die für Linux zu funktionieren scheint , BSD, und Irix, aber ich bin nicht, wie einfach es es auf Windows und MacOS zu portieren sein würde.

habe ich eigentlich dieses System gebaut, bevor sie für die Verwendung in einem kommerziellen C ++ Code Base-, solange Sie nicht jede seltsame Sache unter der Sonne brauchen, haben die Windows-und POSIX-Systemen viel Überlappung Sie abstrahieren kann.

POSIX: Verwenden Sie inotify- es ein ganzes System wahrsten Sinne des Wortes für diesen Job
gebaut Windows: Verwenden Sie „Änderungsereignisse“. Sie haben mehr von den Leim zu bauen und die Berichterstattung selbst (alle APIs, die Sie benötigen zur Verfügung stehen, gibt es einfach nicht die 1-stop-shopping inotify gibt Ihnen).

Die gemeinsamen Dinge, die Sie in Ihrem „Benachrichtigung Faden“ für die Weiterleitung Ereignisse erfassen können, sind:
1) Grundsätzlich kann jede invasive Operation boost :: Dateisystem unterstützt, mit der (möglichen) ausgenommen modifizierende Berechtigungen. Dies ist Dinge wie Verschieben, Erstellen, Löschen, Kopieren von Ordnern und Dateien.
2) Liest und schreibt Dateien (insb. Schreibt). Beachten Sie, dass, wenn Sie async verwenden E / A-Mitteilungen auf out-of-order zeigen kann.
3) Wenn ein neues Volumen kommt, wie jemand den Anschluss ein Flash-Laufwerks.

inotify vor allem gibt Ihnen eine schwindelerregende Höhe von feinkörniger Steuerung Windows weniger. Mit inotify Sie können buchstäblich überwachen alles, was das Dateisystem ist in nahezu in Echtzeit zu tun, wenn Sie wirklich wollen. Ich weiß # 3 ist möglich, mit beiden ohne Polling, aber bewusst sein, dass es wirklich schwierig sein kann, um es arbeiten correctly- auf beiden Systemen.

ich glaube, OS X jetzt entsprechende Haken / Rückrufe hat, weil sie für die Spotlight-Indizierung benötigt wurden.

Unter Linux haben Sie die zusätzliche Mühe, dass es mehrere Dateisysteme verwendet. Wenn Sie die Funktionalität nur für eine begrenzte Anzahl von Dateien / Verzeichnisse benötigen, würde ich versuchen, sich aktiv für Änderungen in regelmäßigen Abständen suchen über.

libevent oder libev zu sein scheinen, was Sie wollen, obwohl ich sie nicht verwendet haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top