2010-02-25 211 views
3

我有很多進程讀取存儲在網絡共享上的文件。最初我只能有一個進程讀取文件,其他所有人都會拋出異常。我執行下面的代碼來處理是:有多個進程讀取同一文件的正確方法?

using (StreamReader fileStreamReader = new StreamReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))) 
{ 
    content = fileStreamReader.ReadToEnd(); 
} 

這讓多個進程讀取同一個文件,但它似乎仍然有問題,因爲有時候多個進程仍然無法訪問該文件。然而,我可以稍後再回來,當文件沒有被使用,並打開它就好了。現在我有一些重試行爲,實施了迄今爲止的隨機延遲,似乎有所幫助。這樣做對我來說似乎有點古怪,那麼更好的方法是什麼?

這是奇怪的部分,我得到的異常根本不是來自文件IO,而是來自名爲CommStudio的庫。總之,我將文件轉儲到一個字符串,我稍微修改它,將其轉儲到內存流中,然後通過rs232上的ymodem將其發送出去。例外是告訴我遠程系統已經取消。獲取數據的設備報告存在傳輸錯誤,這通常意味着收到了不完整/空文件。

通常我會責怪圖書館這個,但它在桌面測試和當只有一個進程訪問文件時完美地工作。唯一真正似乎一致的是,當多個進程訪問文件時,它很可能會失敗。

+0

鎖定網絡共享可以是皮塔餅。你能告訴你正在使用哪些網絡共享(windows版本,unix?)以及你得到了什麼異常? – stmax 2010-02-25 23:24:55

+0

客戶端使用的是XP,服務器是Windows Server,我認爲是2008,但並不完全確定。我發佈了關於異常的編輯。 – MGSoto 2010-02-25 23:30:56

+1

你總是閱讀相同的文件嗎?您可以嘗試在讀取文件後檢查是否正確讀取校驗和(請參見類SHA1)。如果校驗和正確,則知道錯誤來自設備,而不是從網絡共享中讀取。 – stmax 2010-02-25 23:49:45

回答

2

有一個類似的問題,但沒有時間尋找理想的解決方案。我創建了一個web服務,並將該文件粘貼到webservice應用程序的本地文件中,然後創建了一個簡單的單行GET API,它通過Office Intranet被調用,從而確保只有調用應用程序編輯日誌文件..凌亂但功能。

+0

有趣的解決方案。我有點喜歡它,但我不認爲我會得到太多的選票,解決方案。然而,它確實給了我一個想法,因爲我確實有一個控制所有進程的主程序,並且可能爲進程提供他們需要的文件......但是最終還會有多個運行的進程,我寧願去一個有保證的解決方案。 – MGSoto 2010-02-25 23:39:40

0

我以前有類似的問題。嘗試改變你如何訪問這個文件。

//Use FileInfo to get around OS locking of the file 
FileInfo fileInfo = new FileInfo(path); 
//I actually wanted unblocked read write access so change your access and share appropriately 
using (FileStream fs = fileInfo.Open(FileMode.Open, FileAccess.Write, FileShare.ReadWrite)) 
{ 
    //I'm using CopyTo but use whatever method matches your need 
    fileInfo.CopyTo(Path.Combine(destination, fileName), false); 
} 
相關問題