2010-11-23 7 views
4

Dies gilt für Mac, aber es kann auch für Linux gelten, also habe ich es als solches markiert.Erkennen, ob eine Datei auch innerhalb der letzten Sekunde ohne Hashing geändert wurde?

Ich rekursiere durch ein Verzeichnis und bekomme einen Baum mit Dateisystemattributen.

Ich recurse dann wieder (und wieder und wieder) jedes Mal, wenn das Fenster wieder in den Fokus kommt. Wenn ich das Verzeichnis lese, suche ich nach Dateien, die modifiziert wurden und auf denen sie reagieren müssen. Die offensichtliche Sache, die mir in den Sinn kam, war, die Änderungsdaten jeder Datei zu vergleichen, jedoch zeigten meine Komponententests, dass dies nicht zuverlässig war, da die Tests selbst in weniger als einer Sekunde ausgeführt wurden geändert wird als unmodifiziert betrachtet (da es nur auf 1 Sekunde genau ist).

Mein Fix war bisher, auch die Dateigröße zu vergleichen, aber das birgt das Risiko, dass, wenn die Datei geändert wurde, und die resultierende Größe die gleiche ist, wird es auch unentdeckt bleiben.

Weit davon entfernt, jede Datei zu hashen, was einfach nicht machbar ist (zu langsam, wenn eine ganze Verzeichnisstruktur rekursiv ist), gibt es noch etwas, das ich mit HFS/HFS + anbieten kann? Wie eine Versionsnummer/Änderungszahl an die Datei angehängt? Ich befürchte das nicht, obwohl der Grenzfall von Dateien, die sich so schnell ändern, wie meine Komponententests sie ändern, in einem echten Anwendungsfall wahrscheinlich kein Problem ist.

Antwort

12

Echtzeit, am wenigsten Last Lösungen:

Beachten Sie, dass Ihre Problemlösung in Bezug auf die Änderungszeit nur spezifisch für HFS+ ist.

Die am häufigsten verwendete plattformübergreifende Lösung ist File Alteration Monitor.

Weiterführende Links:

+0

Sie Schönheit! :) Jemand hat inotify erwähnt, dann habe ich das FSEvents-Framework auf Mac gefunden, aber das kann nicht mit Dateien umgehen, nur mit Verzeichnissen. Dann gab ich auf. kqueue ist tatsächlich auf dem System vorhanden, also sollte dies den Trick gut machen und wird viel weniger I/O & CPU-intensiv sein als mein derzeitiger Ansatz. – d11wtq

Verwandte Themen