System.IO.Directory.Exists в веб-приложении - PullRequest
1 голос
/ 11 сентября 2010

Я столкнулся с этой странной проблемой:

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 11 сентября 2010

Обратите внимание на следующее со страницы MSDN

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

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

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

1 голос
/ 11 сентября 2010

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

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

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

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

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

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

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

...