2016-05-29 18 views
6

Und ich möchte das mit dem Try Catch Konstrukt speziell erreichen.Wie überprüft man, ob eine Datei bereits geöffnet ist (im selben Prozess)

Diese related question schlägt vor, dass ich tun kann:

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

aber es macht mich nicht. Ich kann die gleiche Datei mehrmals ohne jedes Problem öffnen:

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

Ist es, weil ich Python 3.5 habe? Oder weil ich Raspbian verwende?

Danke für die Hilfe!

+0

Der Grund passen ich mehrere Male eine Datei öffnen kann, ist, weil „nur Windows-Dateien sperrt, wenn zum Schreiben geöffnet. POSIX-Plattformen nicht.“. Weitere Informationen finden Sie unter http://stackoverflow.com/questions/22617452/opening-ready-opened-file-does-not-raise-exception. – maximedupre

+0

Wenn Sie im selben Prozess ausgeführt werden, wie würden Sie nicht wissen, ob die Datei geöffnet ist? –

+0

@PadraicCunningham Ich habe ein Skript, das eine externe Bibliothek/ein Modul importiert, die eine Datei öffnen und schließen können. Mein Skript muss wissen, ob die Datei derzeit geöffnet oder geschlossen ist. – maximedupre

Antwort

4

Sie öffnen dieselbe Datei, weisen sie jedoch verschiedenen Variablen zu. Was Sie tun sollten, ist:

Ich schreibe mit meinem Handy, so dass das Styling nicht gut sein kann, aber Sie werden den Punkt bekommen. Übrigens prüft die .closed nur, ob die Datei durch den gleichen Python-Prozess geöffnet wurde.

+0

Dies löst die Frage des OP nicht? Er fragt, wie man überprüft, ob eine bestimmte Datei geöffnet ist. 'f = offen (f_name, mode)! = f_o = offen (f_name, mode)' weil 'open()' eine Instanz von fileobj zurückgibt. Daher würde 'fileobj.closed' immer zu' False' ausgewertet, vorausgesetzt, Sie haben die Datei in der vorherigen Zeile geöffnet? – TheLazyScripter

+0

Obwohl diese Technik weniger flexibel ist und nicht das 'try ... except'-Konstrukt verwendet, ist sie nicht plattformabhängig und funktioniert tatsächlich. Ich weiß nicht, warum es abgelehnt wurde. – maximedupre

2

Ich würde vorschlagen, so etwas zu verwenden.

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 

Redaktion der OP spezifischen Themen

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

Es funktioniert nicht, ich bin in der Lage, eine Datei umzubenennen, auch wenn sie geöffnet ist. Vielleicht weil mein OS Raspbian ist? – maximedupre

+0

Sie können eine Datei umbenennen, wenn sie bereits geöffnet wurde. –

+0

Vielleicht ist diese Sperre OS-spezifisch, wenn ja, dann würde ich mir die Python-Öffnungsmodi hier http://www.tutorialspoint.com/python/os_open.htm ansehen und "os.O_CREAT" und auch "os.O_EXLOCK" versuchen 'oder eine Kombination. Lassen Sie mich wissen, ob dies auf Raspbian funktioniert. Ich nehme an, es wird, weil es nicht spezifisch ist. – TheLazyScripter

Verwandte Themen