2009-08-24 13 views
3

Ich möchte feststellen, ob eine Datei gesperrt ist, mit Python unter Unix. Es ist in Ordnung, die Datei zu löschen, vorausgesetzt, sie hilft bei der Erkennung, ob die Datei gesperrt wurde.Gesperrte Datei in Python erkennen und löschen

Die Datei könnte ursprünglich ausschließlich von einem anderen Prozess geöffnet worden sein. Die Dokumentation scheint darauf hinzuweisen, dass os.unlink nicht notwendigerweise einen Fehler zurückgibt, wenn die Datei gesperrt ist.

Ideen?

Antwort

6

Der beste Weg zu prüfen, ob eine Datei gesperrt ist, ist zu versuchen, sie zu sperren. Die fcntl module wird dies in Python tun, z.B.

fcntl.lockf(fileobj.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)

Dies wird eine IOError erhöhen, wenn die Datei bereits gesperrt ist; wenn es nicht der Fall ist, können Sie dann rufen

fcntl.lockf(fileobj.fileno(), fcntl.LOCK_UN)

es zu entsperren wieder.

Beachten Sie, dass das Öffnen einer Datei zum Schreiben im Gegensatz zu Windows nicht automatisch zu einer exklusiven Sperre in Unix führt. Beachten Sie außerdem, dass das fcntl-Modul unter Windows nicht verfügbar ist. Sie müssen os.open verwenden, was eine viel weniger freundliche, aber portablere Schnittstelle ist (und möglicherweise die Datei erneut öffnen muss).

6

Aus dem fcntl docs:

fcntl.lockf (fd, Betrieb [, Länge [, Start [, von wo aus]]])

Wenn LOCK_NB verwendet wird und die Sperre nicht erfaßt werden kann, Ein IOError wird ausgelöst und für die Exception wird ein Errno-Attribut auf EACCES oder EAGAIN gesetzt (abhängig vom Betriebssystem; für die Portabilität muss auf beide Werte geprüft werden).

Dies verwendet den zugrunde liegenden Unix-Mechanismus flock, so sieht aus wie es tun soll, was Sie wollen. Beachten Sie auch, dass es auch os.open gibt, die plattformunabhängig sein können.

Verwandte Themen