7
votes

C # Accès refusé au chemin dans une application Windows

J'ai construit une application Windows à l'aide de C #, sous Windows 7.

Tout fonctionne bien, j'ai donc créé un projet d'assistant d'installation, puis la construisit. Une fois que j'ai installé l'application, je peux l'ouvrir correctement, mais lorsque j'essaie de faire une action qui écrit un fichier texte (à des fins de journalisation), il se bloque, me frappant le message d'erreur suivant:

UnauthorizedAccessException

Accès au chemin "C: \ Program Files (x86) \ msprogram \ msprogram \ log.txt 'est refusé.

Quand je manuellement donne à ce dossier des droits complets, cela fonctionne bien. Maintenant, la question est la suivante:

Comment est-ce que je programmatiquement donner aux droits de l'application pour écrire des choses dans le répertoire de mon application? Donc, chaque personne qui les télécharge n'a pas l'expérience du même problème.


0 commentaires

4 Réponses :


23
votes

pas. Les applications ne doivent pas écrire directement des données dans leur répertoire d'installation. Cela fera que l'application fonctionne mal sur Windows Vista et Windows 7, car ce n'est pas la bonne manière de sauvegarder des données.

Vous devriez plutôt utiliser Environnement.gefolderPath et écrire dans un Bon emplacement, tel que le dossier Données de l'application de l'utilisateur ( Environnement.specialfolders. ApplicationData ).


0 commentaires

10
votes

La solution ne consiste pas à octroyer des droits à cette direction, mais d'écrire à un dossier qui convient davantage aux journaux d'application. Les "fichiers de programme (x86)" et "fichiers de programme" sont un lieu d'installation de l'application, non de la journalisation.

Un emplacement plus approprié serait les dossiers de données par utilisateur

  • % AppData%
  • % localAppData%

    ou le résultat de environnement.gefolderPath pour les valeurs suivantes

    • Specialfolder.ApplicationData
    • Specialfolder.localapplicationData
    • Specialfolder.ComplicationData

1 commentaires

Il a précisé que son programme est destiné à Windows OS, mais je recommanderais votre 2e solution pour vous assurer qu'il fonctionne sous un autre système d'exploitation qui n'utiliserait pas% Appdata%, en soi.



3
votes

Généralement, ce n'est pas une bonne pratique d'écrire dans les répertoires de fichiers de programme, j'écris habituellement un fichier journal dans le dossier AppData, que vous pouvez obtenir à l'aide de:

var logFilename = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "log.txt")


0 commentaires

0
votes

Pour ajouter à ce que Reed Copsey et Jaredpar ont écrit dans leurs réponses:

Écrire dans les répertoires "Fichiers de programme" ou "Fichiers de programme (X86)" n'est pas conseillé et pour une bonne raison. La raison en est que l'octroi des autorisations pour toute application d'écrire et / ou de modifier des fichiers dans ces répertoires est un problème de sécurité - il permet un programme «compromis» (par exemple, votre navigateur, au cas où il dispose d'un bogue de sécurité) pour modifier les programmes. fichiers, les infectant de virus ou de vers, etc.

Windows a des dossiers dédiés pour les données d'application et des utilisateurs, et tout programme accédant à des données de ces dossiers devrait le traiter comme des "données non conçues" en raison des restrictions de sécurité inférieures sur ces dossiers. Un tel dossier est Environnement.Specialfolders.ApplicationData - comme indiqué par Reed.


0 commentaires