當另一個應用程序正在更新文件時,是否可以打開文本文件並讀取內容,使其不會導致鎖衝突?日誌文件監視器
我需要監視一個應用程序中的日誌文件,每次發生事件時都會由另一個應用程序更新。
我在嘗試讀取文件之前檢查文件是否正在使用,但似乎並不適用於所有情況。
謝謝,彼得
當另一個應用程序正在更新文件時,是否可以打開文本文件並讀取內容,使其不會導致鎖衝突?日誌文件監視器
我需要監視一個應用程序中的日誌文件,每次發生事件時都會由另一個應用程序更新。
我在嘗試讀取文件之前檢查文件是否正在使用,但似乎並不適用於所有情況。
謝謝,彼得
這取決於第一個應用如何打開該文件。
即,當調用CreateFile API來打開一個文件時,有dwShareMode參數告訴api如何打開它(如果它被賦予0,它不能從其他應用程序IIRC訪問)。 否則從該文件讀取應該沒有問題。 如果我不是搞錯了,要檢查是否被打開讀取文件只ü可以撥打 像
CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;
,因爲寫的應用是不太可能已鎖定該文件,你不會得到一個鎖定衝突。做你的建議一般工作沒有問題(這是什麼UNIX 尾-f命令所做的)和那些確實發生的小毛刺可以被忽略。在過去,我已經編寫了幾個日誌監控應用程序,可以像這樣工作,沒有任何問題。
嘗試使用FileSystemWatcher在文件更新時獲取事件。
更德爾福友好link
FILE_SHARE_READ
。它的意思是,「我,記錄員,允許其他人讀取我的文件」。這些都是最明智的價值觀,我認爲它們會阻止鎖定。其他組合可能是允許的。有is a table here。
現在,你還沒有說當它「似乎並不適用於所有情況」時會發生什麼。下一步做什麼將取決於細節。希望上面的內容能給你提供足夠的信息來解決問題。
除了使文件共享正常工作(根據其他程序請求的內容可能不可能),某些程序會在訪問之間關閉文件。
我以前用我的程序等待文件變得可用,然後快速打開它,抓取所需數據並關閉它,我已經取得了成功。至少在DOS下,試圖訪問一個鎖定的文件導致了一些重試,並且我碰到了這個設置,所以如果其他程序在我擁有它時嘗試了這個文件,它們只會被延遲,從不會看到錯誤。
我甚至能夠更新文件(我確信不是關閉它之間!)沒有其他程序知道一件事情。
醜陋的罪惡,但我們無法改變其他程序,所以這是完成工作的唯一方法。它在內部部署了多年,我從未聽說過該系統用戶的窺視。當其他程序控制的機器退役時,它終於消失了。
XpoLog會做的伎倆不改變你的ENV或代碼,XpoLog日誌監控
阿瓦爾是正確的 - 你在這裏寫程序的擺佈。如果他們被鎖定的文件,然後有幾件事情可以做:
1 - 檢查一個change in the "last modified" date time - 如果改變,那麼你知道東西發生。
2 - 如果mod datetime確實發生了變化,那麼(取決於文件的大小),創建該文件的副本並檢查即可能已足夠好。
查看FileReaderThread.cpp文件中的FileHandlerThread函數(http://tailforwin32.cvs.sourceforge.net/viewvc/tailforwin32/Tail/FileReaderThread.cpp?view=markup) – 2013-11-25 14:41:04
爲了在Delphi中使用,使用TFileStream的類,並通過適當的fmShareXXX常數到構造函數 - 這包裝了CreateFile()功能。 – mghie 2009-04-11 10:15:37