Impossible d’accéder aux fichiers INI dans “Program Files”

J’ai écrit cette application C ++ qui doit vérifier un fichier INI (“preference.ini”) et éventuellement le modifier (par exemple, si l’utilisateur ne veut plus voir le formulaire d’introduction). Je l’ai créé dans WinXP, et cela fonctionne très bien sur le système où je l’ai compilé (dans de nombreux endroits, y compris “Program Files”).

Problème:

  1. Dans Windows 7, cela fonctionne bien si je mets le dossier complet du programme sous “C”: \ “(par exemple” C: \ MyProgram “), mais si je le mets dans” C: \ Program Files (x86) \ MyProgram “, il récupère simplement des données mystérieuses (valeurs non présentes dans mon fichier INI). Lorsque je change certains parameters et les enregistre dans un fichier, il (apparemment) enregistre les modifications (n’obtenez aucune erreur, mais les modifications ne sont pas là quand je vais ouvrir le fichier …
  2. J’ai eu un problème similaire sur un système avec un autre système WinXP (pas celui où je l’ai compilé).

J’ai utilisé ‘getcwd’ pour définir le chemin au moment de l’exécution, et j’ai vérifié que tout allait bien, même sous “Program Files (x86)”:

char currentPath[MAXPATH]; getcwd(currentPath, MAXPATH); std::ssortingng licensePath(currentPath); licensePath.append("\\dat\\preference.ini");' 

Des idées? Merci d’avance pour votre aide.

La réponse est que @Kirill a déjà dit – Win7 ne vous laissera pas écrire de données dans Program Files, sauf si vous disposez d’permissions supérieures à la normale (Exécuter en tant qu’administrateur). Dans ce cas, il est possible que les écritures de votre fichier soient redirigées afin qu’elles fonctionnent toujours, mais les données elles-mêmes ne sont pas stockées dans les fichiers Progam.

Pour append à sa réponse: En général (sauf si vous souhaitez exécuter votre application en tant qu’administrateur), vous ne devez écrire aucune donnée de programme dans le dossier Program Files.

Les parameters d’application doivent être stockés dans l’un des dossiers AppData. Vous pouvez accéder manuellement à l’appdata de votre utilisateur en accédant à la zone de recherche de votre menu Démarrer (Vista / Win7) et en saisissant %appdata% .

Pour trouver cet emplacement dans votre code, utilisez SHGetFolderPath avec CSIDL_APPDATA (utilisateur actuel) ou CSIDL_COMMON_APPDATA (tous les utilisateurs).

Cela pourrait être lié au fait que Windows utilise la virtualisation du système de fichiers. Vous pouvez lire ici à ce sujet. Vérifiez si votre fichier INI se trouve dans \Users\\AppData\Local\VirtualStore .

Il me semble que licensePath : getcwd() + "\\dat\\preference.ini" n’est pas ce que vous attendez.

Enregistrez cette valeur (console ou dans un fichier journal) et voyez quelle est la valeur de licencePath lors de l’exécution du programme à partir de dossiers différents.

Cet article concerne le développement de jeux, mais a la meilleure description de comment et pourquoi cela a été possible.

http://msdn.microsoft.com/en-us/library/ee419001(VS.85).aspx

Ce paragraphe de l’article décrit ce qui se passe le plus probablement –

Si vous essayez de créer ou d’écrire un fichier ou un répertoire sous un dossier qui n’autorise pas l’écriture, le processus échouera sous Windows Vista si l’application ne dispose pas des privilèges d’administration. Si votre exécutable de jeu 32 bits s’exécute en mode hérité, car il n’a pas déclaré de niveau d’exécution demandé, ses opérations d’écriture aboutiront, mais elles seront soumises à la virtualisation comme décrit dans la section “Compatibilité UAC avec les anciens jeux” Cet article.