Вызов Directory.Exists ("\\ SERVER \ SHARE \") в проекте установки - PullRequest
3 голосов
/ 16 февраля 2009

У меня есть проект установки .NET, в который я добавил пользовательское действие установщика. В процессе установки пользователь должен указать путь (который часто является UNC-путем) для общего ресурса на своем файловом сервере. Я пытаюсь выполнить некоторую проверку перед тем, как убедиться, что каталог существует:

if (!Directory.Exists(serverDirectory)) { 
    throw new InstallException("Specified path does not exist or ..."); 
} 

Довольно ванильно - и в консольном приложении код Directory.Exists () работает как положено. Однако в контексте MSI это не так. В частности, вызов Directory.Exists всегда завершается ошибкой при использовании сетевого ресурса. Документация для Directory.Exists указывает , почему :

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

Поиски привели меня к другим аналогичным сценариям в ASP.NET, где олицетворение является решением. Это не применимо здесь, но иллюстрирует проблему.

Как я могу проверить наличие сетевого пути? Чтобы поставить на языке документации - как мне пройти предварительную аутентификацию перед звонком? Пользователь устанавливается как администратор, и просмотр этого пути в проводнике Windows работает успешно, так что это не права пользователя, а отсутствие проверки кодом.

Я создал ненужную проблему - я должен опустить это и выбросить исключение позже при попытке использовать сетевой ресурс ... это в основном тот же самый критический сбой, верно?

1 Ответ

1 голос
/ 16 февраля 2009

Это не просто существование: вам также нужно проверять разрешения и беспокоиться о том, что произойдет, если они изменятся для вас в период между проверкой и фактическим использованием значения.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...