2010-09-11 2 views
1

я столкнулся с этой странной проблемой:System.IO.Directory.Exists в веб-приложении

В веб-приложении .net, есть некоторый код эквивалентен следующему:

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

Это в основном проверяет чтобы узнать, существует ли C: \ Windows \ system32 \ inetsrv \ config каталог, почему код написан так, как это выходит за меня и этот вопрос.

Что меня смущает, приведенный выше код вернет false на двух серверах и вернет true на других. (Я ожидал, что он возвращает истину все время, так как C: \ Windows \ system32 \ Inetsrv \ Config является каталогом системы в Server 2008)

Вопрос: Я хочу знать, почему на тех, два сервера этот оператор вернет false. Где я должен смотреть?

Ограничение: я не могу изменить какой-либо код (обфускации/подписанные сборки), но у меня есть полный доступ к серверам.

Обновление: ответ, по-видимому, довольно прост ... на этих двух конкретных серверах кто-то развернул более новую версию конкретной DLL, которая ведет себя по-разному. Черт!

+1

В соответствии с [документацией] (http://msdn.microsoft.com/en-us/library/system.io.directory.exists.aspx) он может вернуть значение false, если вызывающий объект не имеет разрешения.Просто угадайте, но у программы, возможно, нет привилегий для чтения системного каталога по любой причине. Я не знаю, как его решить, но вы, вероятно, можете начать искать в этой области. –

+2

Возможно ли, что на серверах установлены разные текущие каталоги? Некоторые из них можно запустить из каталога 'inetsrv', а другие - из' System32'. – Gabe

+0

@Jeff, спасибо, я дважды проверю; @Gabe, я тоже об этом думал, но не знаю точно, как проверить, какие-нибудь предложения? –

ответ

2

Примите к сведению следующее из MSDN page

Exists метод возвращает ложь, если какая-либо ошибка возникает при попытке определить, существует ли указанный файл. Это может происходить в ситуациях, которые вызывают исключения, такие как передача имени файла с недопустимыми символами или слишком много символов, сбой или отсутствующий диск или если у вызывающего устройства нет разрешения на чтение файла.

Начну с двойной проверки того, что пользователь, выполняющий веб-приложение (из идентификатора пула приложений, олицетворения и т. Д.), Имеет права доступа к каталогу.

Вы говорите, что вы ожидаете от него истинного, но знаете ли вы, что каталог действительно существует?

+0

А, у меня было предположение, что если все провалится, это вызовет исключение, но после повторного чтения на странице MSDN это, похоже, не подразумевает это. Поэтому я дважды проверю разрешения и прочее. И вам вопрос, да каталог действительно существует. –

1

Ну, первое, что я хотел бы проверить, это то, что указанные каталоги существуют на сервере.

Я предполагаю, что вы проходите абсолютный путь - помните, что пути Windows не гарантируются на разных компьютерах одинаково. Локализованные версии Windows, в частности, могут испортить ваши предположения о том, какие каталоги существуют, а какие нет.

Вместо ссылки на каталог с явным пути:

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

Используйте специальную папку при условии перечисления:

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

... хотя это кажется маловероятным, что эта часть пути изменится на разных машинах.

+0

Спасибо, Майкл, это интересное прозрение, но, к сожалению, не связанное с проблемой (это был относительный путь «config», который был передан) –

Смежные вопросы