Enregistrement de paramètres, sauvegardes etc en WinForm...
Par pitié, chers amis développeurs WinForm (et aussi développeurs Windows en général), arrêtez d'utiliser le répertoire courant de l'application comme répertoire de base pour vos enregistrement !
C'est dangereux et en environnement "standard" vous avez énormement de chances d'échec.
Par environnement "standard" j'entend que l'application est lancée depuis un compte ne possédant pas les pouvoirs administratifs.
Je viens une énième fois de me retrouver confronté à un des problèmes causé par ce comportement.
Soit 2 jeux effectuant leurs sauvegardes de parties dans le répertoire d'installation.
Installation effectuée sous le compte administratif.
Jeu lancé sous un compte "normal", c'est à dire limité.
Tentative de sauvegarde : échec (silencieux dans le cas de ce jeu, donc perte de données...)
Pourquoi ?
Tout simplement car par défaut les utilisateurs limités n'ont pas les droits suffisant en écriture dans le répertoire Program Files et ses sous-répertoires.
Donc en lancant le jeu sous un compte limité, les sauvegardes ne peuvent pas s'effectuer.
Bon, vous me direz la solution est simple : il suffit de marquer dans le manuel d'utilisation qu'il faut accorder les droits suffisants à l'utilisateur sur le répertoire de sauvegarde.
Ce qui va entrainer une réflexion de l'utilsateur et la conclusion suivante : "Pour être tranquille, je vais le faire sur Program Files directement." (Ouch !)
Ou encore pire : "Je vais mettre Contrôle total pour Tout le monde sur Program Files." (AAARG !)
En plus, dans ce cas, n'importe qui pourrait lire les données des autres utilisateurs...
Pour des sauvegardes de jeu ce n'est pas forcément génant (quoique la frustration de la personne qui se fait effacer ses sauvegardes par un autre joueur peut être grande...), mais imaginez pour des données un peu plus personnelles pour lesquelles vous risquez d'avoir le même réflexe...
Pour être complet, on peut aussi citer la """solution""" du lancement de l'application via runas ou de la demande de compte administrateur pour faire de l'impersonification dans l'application. (Ouch ! + AAARG !).
Un peu lourd à mettre en oeuvre pour une simple écriture de fichier, non ?
Sans parler des risques au niveau de l'execution de code potentiellement dangereux avec des privilèges élevés...
Je me permet donc de vous rappeler l'existence de répertoires propres à l'utilisateur et sur lequel vous pouvez être sûr d'avoir les droits suffisants.
Et l'API Win nous fournit justement de quoi récupérer leurs chemins d'accès : SHGetFolderPath
En .Net nous utiliserons pour celà directement la méthode Environment.GetFolderPath associée à l'énumération Environment.SpecialFolder.
- Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) vous permettra de récupérer le chemin d'accès au répertoire de base de l'utilisateur (données itinérantes).
=> ex : C:\Documents and Settings\\Application Data
- Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) vous permettra de récupérer le chemin d'accès au répertoire de base de l'utilisateur (données locales).
=> ex : C:\Documents and Settings\\Local Settings\Application Data
etc...
Si vous voulez visualiser rapidement les chemins associés au différentes valeurs de SpecialFolder, vous pouvez vous servir de ce petit utilitaire de Kenny Kerr :
Special Folders Browser
Il vous permettra aussi d'obtenir en 2 clics la ligne de code pour récupérer la valeur, donc plus d'excuses ;-)

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :