Вызов Directory.Exists("\\SERVER\SHARE\") в проекте установки

StackOverflow https://stackoverflow.com/questions/554132

  •  23-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top