快捷搜索:

「watcher」c# filesystemwatcher 監控文件是否寫完

 

程序是這樣的,它通過filesystemwatcher監控一個A資料夾的.jpg 文件,如果有新文件則傳到伺服器的B資料夾。 測試的時候把比較大的文件拷貝到A資料夾時會發生錯誤,因為該文件正被其他進程占用。我使用一個隊列去保存這些大文件,即如果大文件進入A資料夾,則程序會發生異常,在catch塊把這些發生異常的圖片路徑放到隊列里,使用timer去定時上傳這些文件。 現在發現一個新問題,A文件主要用來存放採集卡採集回來的圖片,這些圖片是先建立個空的jpg 文件,然後不斷寫入流。並且這些文件在複製時不會出現正在被其他文件占用的錯誤。所以在filesystemwatcher監控的時候經常把0KB的空文件上傳到伺服器。我已經把監控的類型設定為監控文件名或最後一次打開文件時間或屬性改變或大小改變等,所有的監控類型都搭配試過了,但是還是不能解決上傳0KB文件的問題。 誰能給個解決辦法,感激不盡!

聲明:青鳥問答所有作品(圖文、音視頻)均由用戶自行上傳分享,僅供網友學習交流。

如內容如侵犯了您的權益,請聯繫本站進行刪除!

如若轉載,請註明出處:http://www.6dcc.com/b/s89x7h17fx.html

2 個回答

  1. #1
    創作者zUzVB1Sl312018-11-22·TA獲得超過5654個贊
    類型裡面有個NotifyFilters.LastWrite好像什麼滴,然後要用他的changed事件,千萬別用created事件。很多人在網上複製一大堆的:
    NotifyFilters.LastAccess | NotifyFilters.LastWrite| NotifyFilters.FileName | NotifyFilters.DirectoryName;
    奇了怪了,怎麼處理了兩次????
    你自己寫的代碼要自己去看,網上那麼多人說是filesystemwatcher問題,看看到底是哪裡問題,對於文件名的changed確實是改變了三次啊,改變了FileName的時候,肯定也改變了LastAccess,有人還發現處理了三次呢,為什麼???他監控下載資料夾,下載文件是創建了,然後改名創建,LastWrite也包括了,觸發changed三次!DirectoryName這個東西是沒用的,只能觸發一次,後面就拜拜,因為你的代碼檢測他啊,他改變一次,filesystemwatcher在原來的路徑就找不到他了,又要重新發現文件,這時候的文件名你已經改了。
    所以我上面說那麼多,就會引來後面的問題,系統會溢出奔潰,其實這個控制項是個異步控制項,正在裡面使用控制項要委託,避免跨線程檢查;方法使用try,catch機制會跳轉,沒有cacth到,就跳了;一連執行三次一樣的方法去操作文件,有可能第一次把文件刪除了,第二次交叉執行又去使用文件路徑,你說找不到路徑的System.IO類型操作是不是系統溢出,這樣就會奔潰。
    這個控制項還有一個小問題,你要注意framework版本,是否認識NotifyFilters.LastWrite
  2. #2
    匿名用戶2013-05-28·TA獲得超過292個贊
    filesystemwatcher檢測到新文件的時候不要直接上傳.先建立一個timer監視文件大小.等文件大小不變了才上傳應該就可以了.

其他類似問題