2009-03-25 9 views
3

Ich habe einen Prozess mit einem offenen Dateihandle zu einer Datei. Ich muss feststellen, ob diese Datei von einem anderen Prozess gelöscht wurde (es könnte eine Datei mit dem gleichen Namen an ihrer Stelle sein). Unter UNIX habe ich die Inodes meines Dateihandles und den Dateipfad über Stat verglichen, aber das funktioniert nicht unter Win32. Wie kann ich das in Perl machen?Wie kann ich feststellen, ob die Datei für ein geöffnetes Dateihandle unter Windows mit Perl gelöscht wurde?

Danke,
-Peter

Antwort

7

Ich kann mich irren (ich bin kein Windows-Programmierer), aber ich dachte, Dateien können nicht gelöscht oder ersetzt werden, wenn sie in Win32 geöffnet werden, oder zumindest standardmäßig ist es nicht möglich.

+0

Ja, soweit ich weiß, erlaubt Windows keine Dateien, die geöffnet werden können. – Powerlord

+0

Ja, das war das Grundproblem. Ich musste es umgehen, indem ich die Datei jedes Mal neu öffne, wenn es geschrieben wird, und dann eine eindeutige Datei-ID erzeuge und vergleiche (erzeugt durch die Kombination der Serien-Seriennummer und des vom Kernel erhaltenen High/Low-Indexes) api Aufruf: GetFileInformationByHandle). – user24881

1

Ich versuche Größe würde zu vergleichen, mtime und atime; sollte für diejenigen sehr schwierig sein, die gleich sind (Sperrung von Unsinn wie, sagen wir, Stat auf einem Dateihandle auf Win32 geben Ihnen die Informationen für die aktuelle Datei im Dateisystem unabhängig davon, ob Ihr Dateihandle auf einer gelöschten Instanz ist). Wenn es möglich ist, dass Ihre Datei innerhalb einer bestimmten Sekunde mehrmals gelöscht und durch eine identische Datei ersetzt wird, und Sie dies erkennen müssen, müssen Sie möglicherweise zu einer Architekturlösung wie nummerierte Versionen Ihrer Datei oder so etwas gehen.

1

Sehen Sie sich das Win32 :: ChangeNotify-Paket an, um sich für die Benachrichtigung über Änderungen an einer Datei oder einem Verzeichnis zu registrieren. Es ist auch möglich, die Datei über das Paket Win32API :: File zu öffnen, so dass sie nicht gelöscht werden kann, solange Sie sie geöffnet haben (siehe insbesondere createFile() und OsFHandleOpen() sowie die CreateFile() -Dokumente auf MSDN).

2

Dies ist ein schwer zu lösendes Problem, insbesondere in Windows und Unix.

Lassen Sie uns sichern. Warum versuchen Sie festzustellen, ob die Datei ersetzt wurde? Meine Vermutung wäre, dass Sie eine Art von Race Condition haben, zwei Programme, die beide versuchen, in dieselbe Datei zu schreiben. Vielleicht würde das Sperren von Dateien hier helfen? Oder um eine echte Datenbank zu benutzen? SQLite und Berkley DB kommen mir in den Sinn.