1. 程式人生 > 資料庫 >Python用access判斷檔案是否被佔用的例項方法

Python用access判斷檔案是否被佔用的例項方法

有的小夥伴想知道用access()函式可以判斷一個檔案被佔用嗎?理論上來說是不行的,access()返回的是檔案的讀寫屬性。為了讓小夥伴們信服,小編進行了簡單的測試。

>>> import os
>>> fn = r'D:\temp\csdn\t.py' # 測試用的檔案
>>> os.access(fn,os.F_OK) # 檔案是否存在
True
>>> os.access(fn,os.R_OK) # 檔案是否可讀
True
>>> os.access(fn,os.W_OK) # 檔案是否可寫
True
>>> os.access(fn,os.X_OK) # 檔案是否可執行
True
>>> fp = open(fn,'a+') # 以追加寫的方式開啟檔案
>>> os.access(fn,os.F_OK) # 檔案當然還在
True
>>> os.access(fn,os.R_OK) # 檔案依然可讀
True
>>> os.access(fn,os.W_OK) # 檔案依然可寫
True
>>> os.access(fn,os.X_OK) # 檔案依然執行
True
>>> fp.close()

可見,os.access()返回的是檔案讀寫屬性,與檔案是否被佔用沒有半毛錢關係。

後來,群裡有同學建議說,不妨用try嘗試著open檔案,如果成功,表示檔案沒有被佔用,如果丟擲異常,則表示檔案被佔用。果真如此嗎?還是用程式碼驗證一下吧。

>>> fp1 = open(fn,'a+')
>>> fp2 = open(fn,'a+')
>>> fp1.close()
>>> fp2.close()

結果表明,對同一個檔案以寫的方式開啟多次,系統並沒有丟擲異常。為什麼會這樣呢?究其原因,是因為檔案被開啟和檔案被佔用是完全兩個不同的問題。順便提醒一下,做上面的測試時,不要使用'w'的方式,否則檔案內容會被清空。

那麼,究竟應該如何用Python判斷一個檔案是否被佔用呢?這個問題還是要回歸到作業系統層面來解決,也就是依賴win32api模組。

>>> import win32file
>>> def is_used(file_name):
  try:
    vHandle = win32file.CreateFile(file_name,win32file.GENERIC_READ,None,win32file.OPEN_EXISTING,win32file.FILE_ATTRIBUTE_NORMAL,None)
    return int(vHandle) == win32file.INVALID_HANDLE_VALUE
  except:
    return True
  finally:
    try:
      win32file.CloseHandle(vHandle)
    except:
      pass
>>> fn = r'D:\temp\csdn\t.py'
>>> is_used(fn)
False
>>> fp = open(fn,'a+')
>>> is_used(fn)
True
>>> fp.close()
>>> is_used(fn)
False

簡單驗證了一下,函式is_used()基本可用。

到此這篇關於Python用access判斷檔案是否被佔用的例項方法的文章就介紹到這了,更多相關Python怎樣用access判斷檔案是否被佔用內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!