2010-09-11 93 views
1

我面對這個奇怪的問題:System.IO.Directory.Exists在Web應用程序

在.NET Web應用程序,有一些相當於此代碼:

if (Directory.Exists("config")) 
{ ... } 

它主要檢查看是否存在C:\ Windows \ system32 \ inetsrv \ config目錄,爲什麼代碼是這樣寫的超出了我和這個問題。

讓我困惑的是上面的代碼會在兩臺服務器上返回false,並在其他服務器上返回true。 (我希望它返回true,所有的時間,因爲C:\ WINDOWS \ SYSTEM32 \ INETSRV \ CONFIG是Server 2008的系統目錄)

問:我想知道爲什麼這些兩個服務器這個語句將返回false。我應該在哪裏看?

限制:我無法更改任何代碼(混淆/簽署的程序集),但我可以完全訪問服務器。

更新:答案顯然很簡單...在這兩個特定的服務器上,有人部署了一個更新版本的特定dll,其行爲有所不同。該死的!

+1

根據[文檔](http://msdn.microsoft.com/en-us/library/system.io.directory.exists.aspx),如果調用方沒有權限,則它可以返回false。只是猜測,但程序可能無權因任何原因而無法讀取系統目錄。我不知道如何解決它,但你可能會開始尋找那個領域。 – 2010-09-11 06:06:13

+2

服務器可能有不同的當前目錄嗎?一些可以從'inetsrv'目錄運行,而另一些則從'System32'運行。 – Gabe 2010-09-11 06:32:26

+0

@傑夫,謝謝我會仔細檢查;加貝,我也想過,但不確定如何檢查,有什麼建議? – 2010-09-13 16:01:58

回答

2

拿筆記從MSDN page

以下的是否存在如果在試圖確定是否存在指定的文件發生任何錯誤方法返回false。在發生例外情況時會發生這種情況,例如傳遞帶有無效字符或太多字符的文件名,磁盤發生故障或丟失,或者調用者無權讀取文件。

我將首先仔細檢查運行Web應用程序的用戶(從應用程序池標識,模擬等)對目錄具有權限。

你說你期望它成真但你有沒有提前確認目錄是否存在?

+0

啊,我的假設是,如果事情失敗會拋出異常,但是重新閱讀後MSDN頁面似乎並不意味着它。所以我會仔細檢查權限和東西。對你而言,是的,這個目錄真的存在。 – 2010-09-13 16:00:58

1

那麼,我會檢查的第一件事情是,有問題的目錄實際上存在於服務器上。

我假設你傳遞了一個絕對路徑 - 記住Windows路徑不保證在不同的機器上是相同的。特別是Windows的本地化版本可能會混淆您對哪些目錄存在和哪些不存在的假設。

而不是引用一個目錄,明確的路徑:

Directory.Exists(@"C:\Windows\system32") 

使用提供的特殊文件夾的枚舉:

Directory.Exists(Environment.GetFolderPath(Environment.SpecialFolder.System)) 

...雖然看似不太可能的路徑的一部分將改變在不同的機器上。

+0

感謝邁克爾,很有趣的見解,但遺憾的是不相關的問題(這是一個相對路徑「配置」,在傳遞) – 2010-09-13 15:49:53