Pergunta

Eu tenho uma instalação do .NET projeto para que eu adicionei uma ação instalador personalizado. Durante o processo de configuração, o usuário tem que fornecer um caminho (que muitas vezes é um caminho UNC) para um compartilhamento em sua servidor de arquivos. I tentar fazer alguma validação antes de prosseguir para certificar-se de que o diretório existe, como tal:

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

baunilha bonita - e em um aplicativo de console, o Directory.Exists () código funciona como esperado. No entanto, no contexto da MSI, isso não acontece. Especificamente, a chamada para Directory.Exists sempre falha quando se utiliza um recurso de rede. A documentação para Directory.Exists não indica por :

O método Exists não executa autenticação de rede. Se você consultar um compartilhamento de rede existente sem ser pré-autenticado, o método Exists retornará false.

Pesquisas me levaram a outros cenários semelhantes em ASP.NET, onde a representação é a solução. Isso não se aplica aqui, mas ilustra a questão.

Como posso verificar a existência do caminho de rede? Para colocar no idioma da documentação - como faço para pré-autenticar antes da chamada? O usuário está instalando como um administrador, e navegar para esse caminho no Windows Explorer funciona com êxito, por isso não é permissões do usuário, mas sim a falta de verificação pelo código.

criei uma preocupação desnecessária -? Eu deveria omitir esta e lançar a exceção mais tarde ao tentar usar o recurso de rede ... é basicamente a mesma falha crítica, direito

Foi útil?

Solução

Não é apenas a existência: você precisa verificar se há permissões, bem como, e se preocupar com o que acontece se mudar em você, no período entre quando você verificar e quando você realmente usar o valor.

Portanto, o mecanismo normal é simplesmente assumir que tudo está bem. Em vez disso, colocar o seu esforço de desenvolvimento para lidar com a exceção quando o pressuposto de prova falsa, porque você precisa ser capaz de fazer isso graciosamente qualquer maneira.

Para este caso, você pode ser capaz de melhorar isso por imediatamente criando um pequeno arquivo de espaço reservado no diretório em questão, e segurando um bloqueio sobre o arquivo até que você está completamente terminado com a pasta. Isso permitiria que você a dar algum feedback melhor, desde que você obterá um erro imediato a tentar criar o arquivo. Ele também ajuda a garantir que a pasta estadias acessível, uma vez sob janelas, pelo menos, os usuários terão uma exclusão dificuldade ou significativamente mudando pasta, desde que você mantenha um bloqueio para esse arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top