2009-07-27 78 views
0

我們有一個Web應用程序,它試圖在Samba裝載上使用一些資源。如果mount在某種程度上失敗了,我需要一種快速檢測和報告錯誤的方法,但是當掛載消失時,File.Exists和Directory.Exists需要30秒才能返回false。快速確定C#中的掛載是否可用的最佳方法是什麼?在Windows中快速檢測文件裝載是否不可用

+0

你不是應該退後一步,並問你爲什麼會關注安裝失敗?當然,這是可能的,但它有多大可能? – 2009-07-27 19:12:27

+0

它不應該發生,但我們必須規劃災難。如果主服務器出現故障,我們希望從備份中準備好/寫入數據。 – 2009-07-27 20:47:49

回答

2

Win32的Windows網絡功能都得到這個信息的唯一途徑。您應該可以使用WNetGetResourceInformationWNetGetConnection。我認爲WNetGetConnection可能是最好的選擇。您最感興趣的返回值是:

ERROR_CONNECTION_UNAVAIL設備當前未連接,但它是持續連接。有關更多信息,請參閱以下備註部分。

ERROR_NO_NETWORK網絡不可用。

所有這一切,我明白要積極主動地從備份位置進行讀取/寫入的願望,但在我看來,在硬件和/或操作系統方面處理更合適,而不是應用程序。硬件和/或操作系統更有可能能夠檢測到讀/寫失敗或某個其他網絡相關事件發生並採取適當的行動。

1

問題在於底層操作系統(Windows)永遠無法返回沒有可用共享這一事實。

我能想到的最快捷的方法就是啓動ping來查看是否從遠程設備獲得響應,如果ping成功(應該可以在一秒鐘內驗證),然後從理論上講,您應該從合理快速的反彈中獲得迴應。如果遠程設備不可用,那麼您也會有一些相對快速的想法。它髒,但肯定會給你比等待Windows檢查超時更快的結果。

這當然不會驗證遠程設備上共享的可用性......您是否有能力在遠程服務器上運行軟件?如果是這樣,你可以寫一個哨兵,可以檢查共享可用性,你可以用共享名稱ping。然後,理論上可以更快地做出反應,因爲不需要超時 - 哨兵會以真或假做出迴應,或者無法立即迴應。無論如何,你會有一個快速的答案。

這就是現在所有的......也許我會在短期內有更多的想法。

3

如果使用File.Exists進行的成功檢查總是在5秒(或更短的時間)內完成,則可以假定任何比此更長的調用都會失敗。

下面是一個僞代碼可能的解決方案:

const int CUSTOM_TIMEOUT = 5; 
bool isMountedVar = false; 

bool isMounted (string path) { 
    Thread mythread = executeNewThread(&isMountedThread, path); 
    sleep(CUSTOM_TIMEOUT); 
    if(mythread.finished()) 
     return isMountedVar; 
    // Otherwise 
    mythread.kill(); 
    return false; 
} 

void isMountedThread(string path) { 
    isMountedVar = File(path).Exists; 
} 
1

我會建議尋找到WIN32Windows Networking Functions,因爲這個功能不是直接從.NET訪問。 可能的起點是WNetGetResourceInformation Function,它有錯誤的返回碼。

WNetGetResourceInformation

當與到網絡資源的遠程路徑提供的,WNetGetResourceInformation功能標識擁有該資源,並獲得有關該資源的類型的信息的網絡提供商。 如果函數失敗,則返回值是一個系統錯誤代碼,例如下列其中一個值。

返回代碼 - 描述

ERROR_BAD_NET_NAME - 輸入lpRemoteName構件不是任何網絡的現有網絡資源。

ERROR_BAD_DEV_TYPE - 輸入的dwType成員與lpRemoteName成員指定的資源類型不匹配。

ERROR_EXTENDED_ERROR - 發生網絡特定錯誤。調用WNetGetLastError獲取錯誤的描述。

ERROR_MORE_DATA - lpBuffer參數指向的緩衝區太小。

ERROR_NO_NETWORK - 網絡不可用。

爲了調用Wnet功能從.NET,搜索實例上Pinvoke.net。快速搜索並沒有拿出一個WNetGetResourceInformation的例子,但有足夠的呼叫其他Wnet功能。有關類似用途,請參閱WNetAddConnection2

WNetAddConnection2函數連接到網絡資源。該功能可以將本地設備重定向到網絡資源。