2009-02-26 88 views
8

我想打開一個由另一個應用程序定期寫入的文件。此應用程序無法修改。因此,我只想在我知道它沒有被其他應用程序寫入時纔打開該文件。Python - 如何檢查一個文件是否被另一個應用程序使用?

有沒有pythonic的方式來做到這一點?否則,我如何在Unix和Windows中實現這一目標?

編輯:我會嘗試澄清。 有沒有辦法檢查當前文件是否已被其他應用程序打開?

我想從這個問題開始。目前,這些其他應用程序的讀/寫是否無關緊要。

我意識到這可能是操作系統的依賴,所以這可能不是真正的python相關現在。

+0

你試圖實現日誌旋轉? – vladr 2009-02-26 07:57:29

+0

不完全,但不是太遠。我想在現有的應用程序之上構建一個應用程序。 – 2009-02-26 08:41:38

回答

7

您的python腳本是否希望打開文件以供書寫或閱讀?遺留應用程序是在寫入之間打開還是關閉文件,還是保持打開狀態?

我們理解遺留應用程序正在做什麼以及您的python腳本試圖實現什麼是非常重要的。

這個功能區域與操作系統高度相關,而且您無法控制遺留應用程序的事實只會讓事情變得更加困難。無論是pythonic還是非pythonic這樣做的方式可能是你最擔心的問題 - 難的問題將是你想要達到什麼將是可能的。


UPDATE

好了,知道(從您的評論)說:

遺留應用程序的打開和 關閉每隔X分鐘的文件,但 我不想假設在t = t_0 + n * X + eps它已經關閉了 該文件。

然後問題的參數被改變。實際上,可以在一些假設條件下以獨立於操作系統的方式完成,或者作爲操作系統相關和操作系統無關的技術的組合。 :)

  1. OS無關的方式:如果它是安全的假設,遺留應用程序保持文件打開的最多的時候一些已知量,說T秒(如打開文件,執行一個寫,然後關閉該文件),並且每隔X秒或多或少地重新打開它,其中X大於2 * T
    • stat文件
    • 減去從now()文件的修改時間,產生D
    • 如果T < = D < X然後打開該文件,你需要用它
    • 什麼這可能是足夠安全爲您的應用程序。隨着T/X的減少,安全性增加。在* nix上,您可能需要仔細檢查/etc/ntpd.conf,以確定正確的時間步長和擺動配置(請參閱修補程序)。對於Windows看到MSDN
  2. 的Windows:除了(或-代替)以上的操作系統無關的方法,你可以嘗試使用兩種:
    • 共享(鎖定):這個假設傳統程序也以共享模式打開文件(通常是Windows應用程序中的默認文件);此外,如果您的應用程序像傳統應用程序嘗試相同(爭用條件)一樣獲取鎖定,則傳統應用程序將失敗。
      • 這是非常侵入性和容易出錯的。除非新應用程序和舊應用程序都需要同步訪問才能寫入同一文件,並且您願意處理遺留應用程序被拒絕打開文件的可能性,否則請勿使用此方法。
    • 試圖找出哪些文件是在傳統的應用程序中打開,使用相同的技術ProcessExplorer(相當於* nix中的lsof
      • 你更容易受到比賽比OS-條件獨立技術
  3. 的Linux /等。:除了(或同代替)上述操作系統無關的方法,則可能嘗試使用相同的技術lsof或,在某些系統中,只需查看哪個文件符號鏈接/proc/<pid>/fd/<fdes>指向
    • 你比獨立於操作系統的技術更容易受到競爭條件的影響
    • 傳統應用程序使用鎖定的可能性很小,但如果是這樣,鎖定不是真正的選擇,除非傳統應用程序可以優雅地處理鎖定的文件(通過阻止,而不是失敗 - 並且如果您自己的應用程序可以保證文件不會保持鎖定狀態,請阻止舊版應用程序進行擴展。)

更新2

如果有利於「檢查遺留應用程序是否打開了該文件」(侵入性的方式容易出現競爭情況),則可以解決上述比賽通過以下條件:

  1. 檢查遺留應用程序是否打開文件(a la lsofProcessExplorer
  2. 暫停遺留應用程序
  3. 重複步驟1中的檢查以確認遺留應用程序未在步驟1和步驟2之間打開文件;如果是,請延遲並重新啓動,否則請繼續執行步驟4
  4. 在文件上完成您的業務 - 理想情況下只需將其重命名以用於後續獨立處理,以便將遺留應用程序暫時保留最短時間
  5. 恢復遺留應用程序
+0

傳統應用程序每隔X分鐘打開和關閉文件,但我不想假設在t = t_0 + n * X + eps它已關閉文件。 – 2009-02-26 08:46:42

0

Unix作爲默認設置沒有文件鎖定。我對Unix環境的最好建議是查看lsof命令的來源。它對哪些進程有哪些文件打開有深刻的瞭解。你可以用它作爲解決方案的基礎。這裏是Ubuntu sources for lsof.

+0

這看起來可能是Unix上的一個很好的解決方案。我可以在訪問它之前解析我需要的文件的輸出。沒有鎖就不是完全安全,但只有在99.99%的情況下我才能處理正確性。 我只需要Windows的解決方案。 – 2009-02-26 08:50:00

0

我已經做的一件事是有python非常暫時重命名該文件。如果我們能夠重命名它,那麼沒有其他進程正在使用它。我只在Windows上測試過。

相關問題