2010-04-23 5 views
9

J'ai une application C# qui crée un fichier de paramètres pour lui-même pour stocker l'état actuel de certains éléments visuels. Cette application fonctionne très bien sur toute machine qui n'exécute pas Windows 7, mais sur ces machines, nous obtenons une erreur que le fichier de paramètres ne peut pas être créé parce que l'utilisateur n'a pas la permission. Maintenant, je pourrais résoudre ce problème en allant sur chaque ordinateur, en me connectant en tant qu'administrateur et en donnant à l'utilisateur un accès en lecture et écriture sur le dossier du programme pour l'application que nous avons installée, mais il doit y avoir un meilleur moyen.Pourquoi mon application C# ne peut-elle pas créer de fichiers sous Windows 7?

Il semble que sous XP, vous ayez un accès en écriture sur les dossiers que vous avez créés par défaut, mais ce n'est plus le cas. Existe-t-il un paramètre dont j'ai besoin dans le package d'installation pour que cela fonctionne?

+0

Avez-vous vérifié que votre package d'installation marquait le répertoire des paramètres en écriture et l'assignait au bon utilisateur? – AlG

+2

vous ne dites pas où vous créez des fichiers, ce qui pourrait être des informations utiles –

Répondre

19

Le fait est que vous ne devriez pas stocker les fichiers de paramètres dans le dossier du programme. Microsoft a déconseillé cela pendant longtemps, mais a commencé à rendre les choses plus strictes avec Vista IIRC. Utilisez Environment.SpecialFolders.ApplicationData (etc) pour trouver l'endroit le plus approprié pour mettre les paramètres. Ou utilisez l'infrastructure des paramètres .NET qui le fait automatiquement pour vous.

+2

Merci, je savais que je faisais quelque chose de fondamentalement faux. J'ai stocké des données dans le dossier du programme pendant des années, et c'est juste une force d'habitude. Je suis passé à la création de mon propre dossier dans Application Data et tout fonctionne bien. –

7

essayez-vous de créer des fichiers dans le dossier d'installation? vous devez utiliser le dossier de données utilisateur pour les données et non les dossiers d'installation. Utilisez le dossier Environment.SpecialFolders.ApplicationData pour obtenir un dossier dans lequel vous pouvez écrire.

4

Vous êtes probablement en cours d'exécution en tant qu'administrateur sur votre machine non-Windows 7 qui écrivent n'importe où. Veillez à enregistrer toutes les données d'instance par utilisateur dans leur dossier AppData (itinérance si elle doit les suivre d'un ordinateur à l'autre, ou locale si c'est un cache ou local pour ne prendre que la machine). Si vous devez partager les paramètres entre les utilisateurs, utilisez le dossier C: \ ProgramData avec les autorisations appropriées.

Un programme ne doit pas essayer de stocker les paramètres dans son répertoire d'installation.

Assurez-vous d'utiliser le SpecialFolders avec le Environment.GetFolderPath pour obtenir les bons emplacements nécessaires. Vous ne devriez jamais coder les chemins car ils peuvent être différents entre les versions ET les langues. (Je sais dans la version allemande de XP ce n'était pas Program Files mais Programme!)

2

Ceci est une faille de sécurité dans votre programme parce que votre programme écrit des informations dans le répertoire du programme (qui est, et devrait être, protégé). S'il s'agit d'une situation de correction de la cause, pensez à utiliser le SpecialFolder enumeration ou les membres statiques sur Application comme CommonAppDataPath pour écrire vos informations dans un emplacement plus approprié.

En supposant l'approche typique pour écrire un fichier via un chemin, il s'agit d'une correction triviale et il n'y a pas de bonne raison pour que l'erreur ne corrige pas la cause première. Si vous n'êtes pas sûr de la façon de manipuler le chemin, pensez à utiliser Path.Combine(). Il le fait pour toi.

2

En général, vous ne devez écrire des données de programme dans aucun dossier sous Program Files (même si vous avez créé le dossier). Vous devez utiliser le Environment.GetFolderPath(...) pour savoir où placer les données spécifiques à votre application. Vous pouvez passer dans l'un des nombreux énumérations définies here - vous voulez probablement Environtment.SpecialFolder.CommonApplicationData

3

cette application fonctionne très bien sur une machine qui ne fonctionne sous Windows 7

Faux! Cela fonctionne uniquement sur ces machines si vous exécutez en tant qu'administrateur.Je pense que vous trouverez que votre programme est cassé sur Windows XP si vous essayez de l'exécuter sur n'importe quel ordinateur professionnel plutôt que sur un ordinateur personnel. Au lieu de cela, ce type d'informations doit être placé dans l'un des dossiers Application Data spéciaux.

2
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 
-1

Je ne vois pas comment cela est une réponse actaul. Je dois pouvoir écrire un rapport et le faire enregistrer dans le dossier des documents de l'utilisateur dans le même dossier que j'ai utilisé pour lire les fichiers xml dont je rédige le rapport.

+0

Alors vous avez écrit une * réponse * juste pour le dire? S'il vous plaît utiliser des commentaires ou poser une nouvelle question (oui, vous ne pouvez toujours pas accéder aux commentaires, vous aurez besoin de fournir de vraies réponses ou poser d'excellentes questions d'abord afin de gagner un représentant) – Leeor

Questions connexes