我們有一個Web應用程序,它試圖在Samba裝載上使用一些資源。如果mount在某種程度上失敗了,我需要一種快速檢測和報告錯誤的方法,但是當掛載消失時,File.Exists和Directory.Exists需要30秒才能返回false。快速確定C#中的掛載是否可用的最佳方法是什麼?在Windows中快速檢測文件裝載是否不可用
回答
Win32的Windows網絡功能都得到這個信息的唯一途徑。您應該可以使用WNetGetResourceInformation或WNetGetConnection。我認爲WNetGetConnection可能是最好的選擇。您最感興趣的返回值是:
ERROR_CONNECTION_UNAVAIL
設備當前未連接,但它是持續連接。有關更多信息,請參閱以下備註部分。
ERROR_NO_NETWORK
網絡不可用。
所有這一切,我明白要積極主動地從備份位置進行讀取/寫入的願望,但在我看來,在硬件和/或操作系統方面處理更合適,而不是應用程序。硬件和/或操作系統更有可能能夠檢測到讀/寫失敗或某個其他網絡相關事件發生並採取適當的行動。
問題在於底層操作系統(Windows)永遠無法返回沒有可用共享這一事實。
我能想到的最快捷的方法就是啓動ping來查看是否從遠程設備獲得響應,如果ping成功(應該可以在一秒鐘內驗證),然後從理論上講,您應該從合理快速的反彈中獲得迴應。如果遠程設備不可用,那麼您也會有一些相對快速的想法。它是髒,但肯定會給你比等待Windows檢查超時更快的結果。
這當然不會驗證遠程設備上共享的可用性......您是否有能力在遠程服務器上運行軟件?如果是這樣,你可以寫一個哨兵,可以檢查共享可用性,你可以用共享名稱ping。然後,理論上可以更快地做出反應,因爲不需要超時 - 哨兵會以真或假做出迴應,或者無法立即迴應。無論如何,你會有一個快速的答案。
這就是現在所有的......也許我會在短期內有更多的想法。
如果使用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;
}
我會建議尋找到WIN32
Windows 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
函數連接到網絡資源。該功能可以將本地設備重定向到網絡資源。
- 1. git快速檢測是否有未跟蹤的文件
- 2. 檢測是否裝配可
- 3. 檢測Windows是否有Windows Update可以下載/安裝的最佳方法?
- 4. 如何檢測文件路徑是否用Python封裝在「..」中?
- 5. 檢測URL是否爲文件下載
- 6. 在windows上快速安裝快車
- 7. 如何檢測Windows中是否安裝了特定的軟件?
- 8. 檢測是否啓用了HTC「快速啓動」
- 9. 快速檢測DataContext表或視圖是否存在
- 10. 可能檢測是否在導航事件中加載了IFRAME?
- 11. 檢查文件是否使用量角器在Windows上下載
- 12. 是否可以檢測幫助文件是否包含在安裝文件(msi或exe)中?
- 13. 檢測Windows是否在Parallels中運行?
- 14. 是否存在快速且可預測的`SendKeys`替代方案?
- 15. 快速文件加載python
- 16. 如何檢測文件是否在tcpdf中成功下載?
- 17. 如何(快速)檢查UNC路徑是否可用
- 18. 檢測Java類是否可加載
- 19. 如何從安裝條件檢測OS是否爲Windows 7 Embedded?
- 20. 快速測試目錄是否爲空
- 21. 檢測.append是否不可用?
- 22. 如何快速檢查是否NPM運行安裝節點
- 23. 快速護照檢查用戶是否連接,在html中
- 24. 是否可以在docker文件中使用已裝載的文件
- 25. 快速檢查實體是否相交?
- 26. 檢查快速會話是否過期
- 27. 快速檢查陣列是否相交
- 28. 快速連續檢測點擊事件
- 29. OpenCV的快速檢測儀
- 30. 快速字符檢測
你不是應該退後一步,並問你爲什麼會關注安裝失敗?當然,這是可能的,但它有多大可能? – 2009-07-27 19:12:27
它不應該發生,但我們必須規劃災難。如果主服務器出現故障,我們希望從備份中準備好/寫入數據。 – 2009-07-27 20:47:49