2012-11-14 4 views
6

Moim celem jest sprawdzenie, czy plik jest zablokowany przez inny proces, czy nie, nawet jeśli nie mam dostępu do tego pliku!Python: Sprawdź plik jest zablokowany

Aby być bardziej zrozumiałym, załóżmy, że otwieram plik za pomocą wbudowanego w pythona mechanizmu open() z przełącznikiem "wb" (do pisania). open() rzuci IOError z errno 13 (EACCES) jeżeli

  1. użytkownik nie ma uprawnień do pliku lub
  2. plik jest zablokowany przez inny proces

jaki sposób można wykryć przypadek (2) tutaj?

moją platformą docelową jest system Windows!

+2

sprawdź http://stackoverflow.com/questions/1861836/checking-file-permissions-in-linux-with-python – monkut

+1

Po ustaleniu, że użytkownik ma uprawnienia i nadal otrzymujesz wyjątek, to wiesz, 2) został trafiony. – monkut

+0

Czy wiesz, jak inny proces blokuje plik? Wygląda na to, że istnieje [wiele sposobów] (http://en.wikipedia.org/wiki/File_locking#In_Unix-like_systems), aby to zrobić. –

Odpowiedz

3

Możesz użyć os.access do sprawdzenia uprawnień dostępu. Jeśli uprawnienia dostępu są dobre, to musi to być drugi przypadek.

+1

Wygląda na to, że os.access jest rozwiązaniem, jednak w systemie Windows, os.access ("myfile", os.R_OK) zwraca True dla pliku, do którego nie mam uprawnień. – Ali

+1

@Ali - masz rację. os.access nie zwraca poprawnej wartości w oknach. tutaj jest problem na python.org [http://bugs.python.org/issue2528]. Zapewnia również poprawkę, ale nie jestem pewien, czy łatanie jej jest proste. – Harman

+1

dziękuję za wskazanie błędu. Apparantly przy użyciu win32security, można łatwo uzyskać uprawnienia ACL do pliku w systemie Windows. – Ali

3

Według the docs:

errno.EACCES 
    Permission denied 
errno.EBUSY 

    Device or resource busy 

Więc po prostu to zrobić:

try: 
    fp = open("file") 
except IOError as e: 
    print e.errno 
    print e 

dowiedzieć się kod errno stamtąd i jesteś ustawiony.

+2

Błąd jest taki sam dla odmowy uprawnień i dla pliku w użyciu. – Ali

+0

przy użyciu 'fp.close()' after 'fp = open (" file ")' Myślę, że może być bezpieczniej. –