2012-11-14 17 views
6

Il mio obiettivo è sapere se un file è bloccato da un altro processo o meno, anche se non ho accesso a quel file!Python: il controllo del file è bloccato

Quindi, per essere più chiari, diciamo che sto aprendo il file usando python's builtin open() con l'opzione 'wb' (per scrivere). open() getterà IOError con errno 13 (EACCES) se

  1. l'utente non dispone dell'autorizzazione per il file o la
  2. il file è bloccato da un altro processo

Come posso rilevare caso (2) qui?

la mia piattaforma di destinazione è Windows!

+2

controlla http://stackoverflow.com/questions/1861836/check-file-permissions-in-linux-with-python – monkut

+1

Una volta stabilito che l'utente ha le autorizzazioni e ottieni comunque l'eccezione, allora conosci il caso (2) è stato colpito. – monkut

+0

Sapete in che modo l'altro processo blocca il file? Sembra che ci siano [più modi] (http://en.wikipedia.org/wiki/File_locking#In_Unix-like_systems) per farlo. –

risposta

3

È possibile utilizzare os.access per verificare l'autorizzazione di accesso. Se i permessi di accesso sono buoni, allora deve essere il secondo caso.

+1

os.access sembra essere la strada da percorrere, tuttavia, su Windows, os.access ("myfile", os.R_OK) restituisce True per un file per il quale non ho il permesso. – Ali

+1

@Ali - hai ragione. os.access non restituisce il valore corretto in Windows. ecco il problema su python.org [http://bugs.python.org/issue2528]. Fornisce anche una patch, ma non sono sicuro se sia banale applicare la patch. – Harman

+1

grazie per aver segnalato il bug. Apparentemente usando win32security, è facile ottenere le autorizzazioni ACL su un file in Windows. – Ali

3

Secondo the docs:

errno.EACCES 
    Permission denied 
errno.EBUSY 

    Device or resource busy 

Quindi, solo fare questo:

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

Capire il codice errno da lì, e siete a posto.

+2

L'errno è lo stesso anche se il diniego del permesso e il file sono in uso. – Ali

+0

usando 'fp.close()' dopo 'fp = open (" file ")' Penso che potrebbe essere più sicuro. –

Problemi correlati