2014-04-24 95 views
1

我已經創建了一個腳本來根據特定條件重命名文件夾中的文件。在做任何事之前檢查文件是否打開

if len(self.toLoc.get()) == 0: 
     searchRev = "_R" + newRev 
     for filename in os.listdir(App.pdfDir): 
      try: 
       filePath, fileExtension = os.path.splitext(filename) 
       sep = searchesri 
       rest = filename.split(sep, 1)[0] + searchRev + fromLocation + fileExtension 
       if fileExtension == '.pdf': 
        shutil.move(os.path.join(App.pdfDir, filename), os.path.join(App.pdfDir, rest)) 
       elif fileExtension == '.xlsx': 
        shutil.move(os.path.join(App.pdfDir, filename), os.path.join(App.pdfDir, rest)) 
      except IOError: 
       print ("Errror") 

我想使用嘗試,除了在做任何重命名之前查看文件是否打開。截至目前,如果文件已打開,程序會吐出「錯誤」消息並重命名該文件,但在目錄中保留原件的副本。我希望有一種方法可以在啓動重命名過程之前檢查是否有任何文件已打開?感謝您的任何建議。

+0

這不可靠,因爲檢查後可能會打開一個文件。 – Barmar

+0

您是否可以(或需要)這取決於您的操作系統。假設POSIX語義,這是不必要的,因爲文件可以有多個名稱,所以打開的文件句柄不依賴於文件的名稱。多個進程可以一次打開一個文件以便讀取(甚至可能用於寫入,但必須小心協調寫入)。重命名打開的文件不應該影響已經在其他進程中打開的文件句柄。 – chepner

+0

[檢查一個文件是否在Python中打開]可能的重複(http://stackoverflow.com/questions/6825994/check-if-a-file-is-open-in-python) –

回答

1

編輯:Possible duplicate

你可以簡單地嘗試open文件第一,這將引發和IOException如果它是:

if len(self.toLoc.get()) == 0: 
searchRev = "_R" + newRev 
for filename in os.listdir(App.pdfDir): 
    try: 
     filePath, fileExtension = os.path.splitext(filename) 
     with open(os.path.join(App.pdfDir, filename),"r+") as f: 
      pass 
     sep = searchesri 
     rest = filename.split(sep, 1)[0] + searchRev + fromLocation + fileExtension 
     if fileExtension == '.pdf': 
      shutil.move(os.path.join(App.pdfDir, filename), os.path.join(App.pdfDir, rest)) 
     elif fileExtension == '.xlsx': 
      shutil.move(os.path.join(App.pdfDir, filename), os.path.join(App.pdfDir, rest)) 
    except IOError: 
     print ("Errror") 

對於確保該文件後不開檢查並在此過程中,shutil.move是原子的(在使用時基本上鎖定訪問)when on the same filesystem

+0

感謝您的幫助! – unknownid

相關問題