web-dev-qa-db-fra.com

System.UnauthorizedAccessException: l'accès au chemin "..." est refusé

L'installation de C # wpf est effectuée avec .net en utilisant l'installation click-once. Tout fonctionne bien. Ensuite, j'ai le code suivant qui fait partie du programme installé:

String destinationPath = System.Windows.Forms.Application.StartupPath + "\\" + fileName;
File.Copy(path, destinationPath, true);
this.DialogResult = true;
this.Close();

Mais je reçois cette erreur:

System.UnauthorizedAccessException: l'accès au chemin C:\user\pc\appdata\local\apps\2.0 ....... est refusé.

à System.IO.File.InternalCopy (String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost) à System.IO.File.Copy (String sourceFileName, String destFileName, Boolean overwrite)

Est-ce une erreur d'autorisation ou dois-je modifier quelque chose dans mon code?

Ce qui m'intrigue, c'est pourquoi l'utilisateur est en mesure d'installer le programme en cliquant une fois dans ce répertoire sans aucun problème, mais le téléchargement d'un fichier ne fonctionne pas?

7
user5313398

Lors de l'installation d'une application, le programme d'installation demande généralement des privilèges administratifs. Si l'utilisateur choisit "Oui", le programme s'exécutera et aura un accès en lecture et en écriture à une plus grande variété de chemins que ce qu'un utilisateur normal possède. Si le cas est tel que le programme d'installation n'a pas demandé de privilèges administratifs, il se peut que ClickOnce s'exécute automatiquement sous une sorte de privilèges élevés.

Je vous suggère plutôt d'écrire dans le dossier appdata local, mais si vous sentez que vous voulez vraiment écrire dans le même répertoire que votre application, vous devez d'abord exécuter votre application avec des privilèges d'administrateur.

Pour que votre application demande toujours des privilèges d'administrateur, vous pouvez modifier le fichier manifeste de votre application et définir l'attribut requestedExecutionLevel de la balise level sur requireAdministrator:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Vous pouvez en lire un peu plus dans ( Comment puis-je forcer mon application .NET à s'exécuter en tant qu'administrateur?

8
Visual Vincent

J'exécutais un programme qui générerait un fichier. Le dossier de destination était en lecture seule. Et cela planterait avec l'erreur. La suppression de l'attribut en lecture seule à l'aide des propriétés de dossier a résolu l'erreur. J'espère que cela t'aides.

2
Ziaullah Khan

Je pense que l'accès à% appdata% est limité par défaut sur Windows 8 (ou 7). Lorsque l'application installée via ClickOnce, vous êtes probablement invité à lui donner la permission de modifier cet ordinateur - est-ce vrai?

Vous pouvez essayer d'exécuter l'application avec des autorisations d'administrateur comme test (maintenez la touche Maj enfoncée, cliquez avec le bouton droit sur le fichier .exe, exécutez en tant qu'administrateur), ce qui le résoudra probablement, mais ce n'est pas un moyen idéal de le faire.

Essayez plutôt un autre dossier, quelque chose comme:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

ou

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments )

ce qui devrait vous donner plus de chance.

En guise de remarque - si vous créez des chemins dans le code, plutôt que d'utiliser

path + "\\" + path + "\\" + filename 

qui est susceptible d'échouer (chemin peut déjà avoir un\à la fin), il est généralement préférable d'utiliser Path.Combine (..)

String destinationPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), fileName);

Bonne chance!

1
jb.

Tout d'abord, si vous avez besoin d'écrire des données, vous devez utiliser le Environment.SpecialFolder énumération.

Deuxièmement, n'écrivez dans aucun dossier dans lequel l'application est déployée car elle est généralement en lecture seule pour les applications. Vous voudrez probablement écrire dans les énumérations ApplicationData ou LocalApplicationData.

1
Justin Loveless