簡體   English   中英

讀取 windows 文件而不阻止另一個進程寫入它

[英]Reading a windows file without preventing another process from writing to it

我有一個我想閱讀的文件。 該文件可能隨時被另一個進程覆蓋。 我不想阻止那篇文章。 我准備好管理我讀取的數據的損壞,但不希望我的讀取以任何方式改變寫入過程的行為。

寫入文件的進程是在服務器本地運行的 delphi 程序。 它使用 fmCreate 打開文件。 fmCreate 嘗試以獨占方式打開文件,如果文件上有任何其他句柄則失敗。

我正在從 python 腳本讀取文件,該腳本通過 our.network 遠程訪問文件。

我感興趣的是有沒有解決方案,不管是python支持還是delphi支持。我想知道在windows下有沒有不修改寫程序就可以實現的方法。

編輯:重申一下,這不是重復的。 另一個問題是試圖獲得對正在寫入的文件的讀取權限。 我希望作者能夠訪問我已打開以供閱讀的文件。 這些是不同的問題(盡管我擔心答案會相似,但無法完成。)

我認為,這么多年后,真正的答案是使用機會鎖 有了這個,您可以打開文件進行讀取訪問,同時告訴操作系統您希望在另一個程序想要訪問該文件時得到通知。 基本上,您可以隨心所欲地使用該文件,然后在其他人需要時退出。 如果您剛剛“正常”打開文件,這可以避免其他程序通常會遇到的共享/訪問沖突。

一篇關於機會鎖的 MSDN 文章 Raymond Chen 也有一篇關於此的博客文章,並附有示例代碼: Using opportunistic locks to get out of the way if somebody wants the file

關鍵是使用FSCTL_REQUEST_OPLOCK標志調用DeviceIoControl function,並將句柄傳遞給您之前通過調用CreateEvent創建的事件。

從 Delphi 使用它應該很簡單,因為它支持調用 Windows API 函數。 我不太確定Python。但是,考慮到問題中的安排,應該沒有必要修改Python代碼。 只需讓您的 Delphi 代碼在打開文件時使用機會鎖,並在 Python 腳本需要該文件時讓開。

也比過濾器驅動程序或卷影復制服務更容易和更輕量級。

您可以設置一個篩選器驅動程序,該篩選器驅動程序可以通過兩種方式起作用:(1)在打開文件時修改標志;(2)在將文件寫入文件時可以捕獲數據,並將數據副本保存到其他位置。

與注釋中提到的卷影復制服務相比,此方法輕便得多且效率更高,但是它需要使用篩選器驅動程序。 市場上有幾種驅動程序(即那些包含驅動程序並允許您在用戶模式下編寫業務邏輯的產品),但它們成本高昂,在您的情況下可能會過大。 不過,如果您僅需要私人使用的東西,請私下聯系我以獲取我們的CallbackFilter的許可。

更新:如果要讓編寫者打開已打開的文件,則唯一的選擇是一個過濾器,該過濾器將在打開文件時修改標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM