2009-04-17 24 views
1

有兩個應用程序。 第一個應用程序遠離有問題的機器(並且我沒有ACESSS),並通過網絡(LAN)創建一個大文件。我無法控制這一過程,也不知道何時發生。這是我必須要做的事情。我無法以任何方式添加,更改或更改此內容。通過檢測文件打開(創建)進程同步

第二個應用程序由我編寫,並在找到它時處理此文件。這個程序計劃每5分鐘運行一次。

當我的應用程序嘗試處理該文件導致處理不完整和/或其他錯誤時,可能會出現文件處於寫入過程中的情況,因此我需要檢測文件是否已完全寫入開始處理它。

我可以使用OpenFile()並請求讀/寫鎖定訪問。錯誤將表明文件正在創建。

我可能做一些巧妙的搭配文件系統觀察 http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

但我懷疑有我沒有的Windows(NT和更高版本)想到了一個優雅的方式

回答

0

一個完全hackish的方法是在遠程計算機上安裝一個API鉤子來關閉文件,然後啓動程序或發送完成的通知。

+0

不幸的是,遠程進程(遠程機器)不可訪問。 – 2009-04-17 15:25:07

2

標準解決方案是讓寫入者寫入臨時文件,然後在完成後重命名文件。

通過這種方式,讀者(您的應用程序)將只能在文件完成時看到該文件。

+0

不幸的是,我無法訪問作者(遠程過程)來實現這一點。 – 2009-04-17 15:25:57

+0

是的,我注意到你已經更新了你的文章......有點OTT我不得不說! – 2009-04-17 17:14:48

+0

沒有違法意圖,只是爲了清晰起見:) – 2009-04-18 01:30:09

1

回到過去,我不得不編寫使用網絡上的文件(通過Novell文件服務器在某些* NIX應用程序和Windows應用程序之間)進行通信的軟件。爲了可靠地做到這一點,我們總是說服數據文件的提供者在完成數據寫入時創建一個額外的握手文件(只是一個空文件)。我們的應用程序將輪詢握手文件,如果握手文件存在,我們讀取數據文件。當我們的應用程序讀完數據後,它會刪除握手文件。握手文件由供應商監控,只要握手文件存在,供應商就不會觸摸數據文件。

但是,大部分時間數據的提供者願意修改他們的應用程序。我認爲唯一可行的方法是從提供商處獲得信號。

3

我認爲你的系統觀察者解決方案通過FileSystemWatcher或ReadDirectoryChanges是最好的,你可以得到。您也可以在CodeProject中查看this tutorial。無論如何,它有多優雅?

2

另一個答案,但不同:我突然想起另一個項目做了類似的事情。我的應用程序只使用OpenFile()OF_SHARE_EXCLUSIVE(我認爲),直到它成功打開文件。在這種情況下,這可以正常工作,因爲我的應用程序正在訪問由遠程應用程序寫入與我的應用程序相同的機器上的共享文件。我從來沒有用文件服務器上的文件測試它,但它可以工作。但是,與遠程文件一起使用時,文件鎖定並不總是可靠的。

0

其他許多人已經指出,唯一的理智方式是一次額外的握手。因爲這似乎是不可能的,我會做以下。

  • 編寫您的應用程序永久運行(如守護進程)。
  • 檢查的文件,如果你發現它
    • 監視它的大小,直到它不再生長指定的時間(如30秒)
    • 文件重命名你決定後,它的完成轉移
    • 處理更名文件