2009-04-10 108 views
4

當另一個應用程序正在更新文件時,是否可以打開文本文件並讀取內容,使其不會導致鎖衝突?日誌文件監視器

我需要監視一個應用程序中的日誌文件,每次發生事件時都會由另一個應用程序更新。

我在嘗試讀取文件之前檢查文件是否正在使用,但似乎並不適用於所有情況。

謝謝,彼得

回答

10

這取決於第一個應用如何打開該文件。

即,當調用CreateFile API來打開一個文件時,有dwShareMode參數告訴api如何打開它(如果它被賦予0,它不能從其他應用程序IIRC訪問)。 否則從該文件讀取應該沒有問題。 如果我不是搞錯了,要檢查是否被打開讀取文件只ü可以撥打 像

CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ; 
+3

爲了在Delphi中使用,使用TFileStream的類,並通過適當的fmShareXXX常數到構造函數 - 這包裝了CreateFile()功能。 – mghie 2009-04-11 10:15:37

0

,因爲寫的應用是不太可能已鎖定該文件,你不會得到一個鎖定衝突。做你的建議一般工作沒有問題(這是什麼UNIX 尾-f命令所做的)和那些確實發生的小毛刺可以被忽略。在過去,我已經編寫了幾個日誌監控應用程序,可以像這樣工作,沒有任何問題。

1
  1. Sysinternals公司的下載進程監視器。
  2. 打開過濾器對話框併爲日誌文件添加一個「路徑」過濾器。
  3. 啓動日誌寫入應用程序(我將稱之爲「記錄器」)。
  4. 查找並單擊記錄程序執行CreateFile的事件。
  5. 在「詳細信息」下,它應該具有「期望訪問:通用寫入」。它應該有「ShareMode:Read」,它對應於在CreateFile調用中的FILE_SHARE_READ。它的意思是,「我,記錄員,允許其他人讀取我的文件」。
  6. 現在運行你的日誌閱讀應用程序(「logreader」),並做同樣的練習。
  7. 細節應該有「期望訪問:通用讀取」。它應該有「ShareMode:Read,Write」,這意味着,「我,日誌讀取器,允許其他人,包括日誌寫入者讀取和寫入日誌文件」。

這些都是最明智的價值觀,我認爲它們會阻止鎖定。其他組合可能是允許的。有is a table here

現在,你還沒有說當它「似乎並不適用於所有情況」時會發生什麼。下一步做什麼將取決於細節。希望上面的內容能給你提供足夠的信息來解決問題。

0

除了使文件共享正常工作(根據其他程序請求的內容可能不可能),某些程序會在訪問之間關閉文件。

我以前用我的程序等待文件變得可用,然後快速打開它,抓取所需數據並關閉它,我已經取得了成功。至少在DOS下,試圖訪問一個鎖定的文件導致了一些重試,並且我碰到了這個設置,所以如果其他程序在我擁有它時嘗試了這個文件,它們只會被延遲,從不會看到錯誤。

我甚至能夠更新文件(我確信不是關閉它之間!)沒有其他程序知道一件事情。

醜陋的罪惡,但我們無法改變其他程序,所以這是完成工作的唯一方法。它在內部部署了多年,我從未聽說過該系統用戶的窺視。當其他程序控制的機器退役時,它終於消失了。

0

XpoLog會做的伎倆不改變你的ENV或代碼,XpoLog日誌監控

0

阿瓦爾是正確的 - 你在這裏寫程序的擺佈。如果他們被鎖定的文件,然後有幾件事情可以做:

1 - 檢查一個change in the "last modified" date time - 如果改變,那麼你知道東西發生。

2 - 如果mod datetime確實發生了變化,那麼(取決於文件的大小),創建該文件的副本並檢查可能已足夠好。

0

我們用「尾爲Win32」,

我知道它不是德爾福,但它可能是有用的

http://tailforwin32.sourceforge.net/

+0

查看FileReaderThread.cpp文件中的FileHandlerThread函數(http://tailforwin32.cvs.sourceforge.net/viewvc/tailforwin32/Tail/FileReaderThread.cpp?view=markup) – 2013-11-25 14:41:04