2016-05-29 25 views
6

E mi piacerebbe farlo concretamente con il costrutto try catch.Come verificare se un file è già stato aperto (nello stesso processo)

Questo related question suggerisce che posso fare:

try: 
    open(fileName, 'wb+') 
except: 
    print("File already opened!") 
    raise 

Tuttavia, la cosa non mi funziona. Posso aprire lo stesso file più volte senza alcun problema:

fileObj1 = open(fileName, 'wb+') 
fileObj2 = open(fileName, 'wb+') 

È perché ho Python 3.5? O perché sto usando Raspbian?

Grazie per l'aiuto!

+0

Il motivo che posso aprire un file più volte è perché "solo Windows blocca i file quando è aperto per la scrittura. Piattaforme POSIX non lo fanno.". Vedi http://stackoverflow.com/questions/22617452/opening-already-opened-file-does-not-raise-exception per ulteriori informazioni. – maximedupre

+0

Se si sta eseguendo nello stesso processo come non sapresti se il file è aperto? –

+0

@PadraicCunningham Ho uno script che importa una libreria/un modulo esterno in grado di aprire e chiudere un file. Il mio script ha bisogno di un modo per sapere se il file è attualmente aperto o chiuso. – maximedupre

risposta

4

Si apre lo stesso file ma si assegnano a variabili diverse. Quello che dovresti fare è:

fileobj=open(filename,"wb+") 

if not fileobj.closed: 
    print("file is already opened")` 

Sto scrivendo con il mio telefono in modo che lo styling non sia buono ma otterrai il punto. A proposito il .closed controlla solo se il file è stato aperto dallo stesso processo Python.

+0

Questo non risolve la domanda dell'OP? Sta chiedendo come controllare se un file specifico è aperto. 'f = open (f_name, mode)! = f_o = open (f_name, mode)' perché 'open()' restituisce un'istanza di alcuni fileobj. Quindi 'fileobj.closed' valuterà sempre' False' assumendo che tu abbia aperto il file sulla riga precedente? – TheLazyScripter

+0

Sebbene questa tecnica sia meno flessibile e non utilizzi il costrutto 'try ... except', non dipende dalla piattaforma e in realtà funziona. Non so perché è stato downvoted. – maximedupre

2

Suggerirei di usare qualcosa di simile.

def is_open(file_name): 
    if os.path.exists(file_name): 
     try: 
      os.rename(file_name, file_name) #can't rename an open file so an error will be thrown 
      return False 
     except: 
      return True 
    raise NameError 

cura per adattarsi questioni specifiche della OP

class FileObject(object): 
    def __init__(self, file_name): 
     self.file_name = file_name 
     self.__file = None 
     self.__locked = False 

    @property 
    def file(self): 
     return self.__file 

    @property 
    def locked(self): 
     return self.__locked 

    def open(self, mode, lock=True):#any testing on file should go before the if statement such as os.path.exists() 
     #replace mode with *args if you want to pass multiple modes 
     if not self.locked: 
      self.__locked = lock 
      self.__file = open(self.file_name, mode) 
      return self.file 
     else: 
      print 'Cannot open file because it has an exclusive lock placed on it' 
      return None #do whatever you want to do if the file is already open here 

    def close(self): 
     if self.file != None: 
      self.__file.close() 
      self.__file = None 
      self.__locked = False 

    def unlock(self): 
     if self.file != None: 
      self.__locked = False 
+0

Non funziona, sono in grado di rinominare un file anche se è aperto. Forse perché il mio sistema operativo è Raspbian? – maximedupre

+0

È possibile rinominare un file quando è già stato aperto. –

+0

Forse quel blocco è specifico per il sistema operativo, se così fosse, darei un'occhiata alle modalità aperte di Python qui http://www.tutorialspoint.com/python/os_open.htm e provate 'os.O_CREAT' e anche' os.O_EXLOCK 'o una combinazione. Fammi sapere se funziona su Raspbian. Presumo che lo farà perché non è specifico per OS. – TheLazyScripter

Problemi correlati