Question

J'ai un projet d'installation de .NET auquel j'ai ajouté une action d'installation personnalisée. Au cours du processus d'installation, l'utilisateur doit fournir un chemin (ce qui est souvent un chemin UNC) à un partage sur leur serveur de fichiers. Je tente de faire une validation avant de procéder pour vous assurer que le répertoire existe, en tant que tel:

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

vanille Jolie - et dans une application de la console, les Directory.Exists () code fonctionne comme prévu. Cependant, dans le contexte de la MSI, il ne fonctionne pas. Plus précisément, l'appel à Directory.Exists échoue toujours lorsque vous utilisez une ressource réseau. La documentation pour Directory.Exists n'indique pourquoi :

  

La méthode n'effectue Exists pas l'authentification réseau. Si vous interrogez un partage réseau existant sans être pré-authentifié, la méthode Exists retournera false.

recherches me ont conduit à d'autres scénarios similaires dans ASP.NET où l'usurpation d'identité est la solution. Ce n'est pas applicable ici, mais il illustre la question.

Comment puis-je vérifier l'existence du chemin de réseau? Pour mettre dans la langue de la documentation - comment puis-je préauthentification avant l'appel? L'utilisateur installe en tant qu'administrateur, et en accédant à ce chemin dans l'Explorateur Windows fonctionne avec succès, il est donc pas des autorisations de l'utilisateur, mais plutôt un manque de contrôle par le code.

Ai-je créé une préoccupation inutile - dois-je omettre cela et jeter l'exception plus tard en essayant d'utiliser la ressource réseau ... il est en grande partie le même échec critique, droit

?
Était-ce utile?

La solution

Il est non seulement l'existence: vous devez vérifier les autorisations aussi bien, et vous soucier de ce qui se passe sur vous si elles changent dans la période entre le moment où vous vérifiez et quand vous utilisez réellement la valeur.

Par conséquent, le mécanisme normal est de supposer que tout va bien. Au lieu de cela, mettre vos efforts de développement dans le traitement l'exception lorsque l'hypothèse se révèle fausse, parce que vous devez être en mesure de le faire gracieusement de toute façon.

Dans ce cas, vous pourriez être en mesure d'améliorer ce en créant immédiatement un petit fichier d'espace réservé dans le répertoire en question, et la tenue d'un verrou sur ce fichier jusqu'à ce que vous êtes complètement terminé avec le dossier. Cela vous permettra de donner une meilleure rétroaction, puisque vous aurez une erreur immédiate essayant de créer le fichier. Il contribue également à garantir que le dossier reste accessibles, car sous Windows au moins les utilisateurs auront du mal à la suppression du dossier ou modifier de manière significative tant que vous maintenez un verrou à ce fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top