Quel est le meilleur moyen de stocker les parameters utilisateur pour une application .NET?

J’ai une application Windows Forms .NET 2.0. Où est le meilleur endroit pour les parameters utilisateur du magasin (en tenant compte des directives Windows)?

Certaines personnes ont désigné Application.LocalUserAppDataPath . Cependant, cela crée une structure de dossier comme:

C: \ Documents and Settings \ nom_utilisateur \ Paramètres locaux \ Données d’application \ nom_entreprise \ nom_produit \ version_produit \

Si je publie la version 1 de mon application et y stocke un fichier XML, puis la version 2, qui changera de dossier, n’est-ce pas? Je préférerais avoir un seul dossier, par utilisateur, pour stocker les parameters, quelle que soit la version de l’application.

J’adore utiliser les parameters d’application intégrés. Vous avez ensuite intégré la prise en charge de l’utilisation du concepteur de parameters si vous souhaitez, au moment du design ou à l’exécution, utiliser:

 // read setting ssortingng setting1 = (ssortingng)Settings.Default["MySetting1"]; // save setting Settings.Default["MySetting2"] = "My Setting Value"; // you can force a save with Properties.Settings.Default.Save(); 

Il stocke les parameters dans une structure de dossiers similaire à celle que vous décrivez (avec la version dans le chemin). Cependant, avec un simple appel à:

 Properties.Settings.Default.Upgrade(); 

L’application va extraire tous les parameters des versions précédentes pour les enregistrer.

Les applications .NET ont un mécanisme de paramétrage intégré facile à utiliser. Le problème, à mon avis, est qu’il stocke ces parameters dans un répertoire plutôt obscur et que les utilisateurs finaux ne pourront pas le trouver. De plus, le simple fait de passer du débogage au lancement de la version modifie l’emplacement de ce répertoire, ce qui signifie que tous les parameters enregistrés dans une configuration sont perdus dans l’autre.

Pour ces raisons et d’autres, j’ai créé mon propre code de configuration pour Windows Forms . Ce n’est pas aussi simple que celui fourni avec .NET, mais c’est plus flexible et je l’utilise tout le temps.

Ou écrivez vos parameters dans un fichier xml et enregistrez-le à l’aide du stockage isolé . Selon le magasin que vous utilisez, il l’enregistre dans le dossier Application Data. Vous pouvez également choisir un magasin activé pour l’itinérance, ce qui signifie que lorsque l’utilisateur ouvre une session sur un autre ordinateur, les parameters sont transférés avec lui.

Une approche qui a fonctionné pour moi dans le passé a été de créer une classe de parameters et d’utiliser la sérialisation XML pour l’écrire dans le système de fichiers. Vous pouvez étendre ce concept en créant une collection d’objects de parameters et en la sérialisant. Vous aurez tous vos parameters pour tous les utilisateurs au même endroit sans avoir à vous soucier de la gestion du système de fichiers.

Avant que quiconque me donne un feuilleton pour réinventer partiellement la roue, permettez-moi de dire quelques mots. D’une part, ce ne sont que quelques lignes de code pour sérialiser et écrire le fichier. Deuxièmement, si vous avez un object contenant vos parameters, vous n’avez pas besoin de faire plusieurs appels à l’object appSettings lorsque vous chargez votre application. Enfin, il est très facile d’append des éléments qui représentent l’état de vos applications, ce qui vous permet de reprendre une tâche de longue durée lorsque l’application se charge par la suite.

Les parameters sont des paires clé-valeur standard (chaîne de caractères). Je pourrais les envelopper dans un fichier XML, si cela peut vous aider.

Je préfère utiliser le système de fichiers au lieu du registre. Cela semble plus facile à maintenir. Dans les scénarios de support, si l’utilisateur doit ouvrir / modifier manuellement les parameters, cela serait plus facile s’il se trouve dans le système de fichiers.

J’essaie quelques méthodes pour stocker mes parameters simplement en fichier texte et j’ai trouvé le meilleur moyen:

fichier stocké dans le dossier de l’application, à utiliser, settings.txt : (à l’intérieur des parameters de fichiers approuvés commentaires, essayez // comment)

// pour obtenir la valeur des parameters

 Settings.Get("name", "Ivan"); 

// pour définir la valeur des parameters

 Settings.Set("name", "John"); 

en utilisant:

 using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; 

// vous pouvez également stocker avec le nom de la section, pour utiliser simplement append le nom de la section Set (nom de la section, nom, valeur) et Get (nom de la section, nom, valeur)

 public static class Settings { private static ssortingng SECTION = typeof(Settings).Namespace;//"SETTINGS"; private static ssortingng settingsPath = Application.StartupPath.ToSsortingng() + "\\settings.txt"; [DllImport("kernel32")] private static extern long WritePrivateProfileSsortingng(ssortingng section, ssortingng key, ssortingng val, ssortingng filePath); [DllImport("kernel32")] private static extern int GetPrivateProfileSsortingng(ssortingng section, ssortingng key, ssortingng def, SsortingngBuilder retVal, int size, ssortingng filePath); public static Ssortingng GetSsortingng(Ssortingng name) { SsortingngBuilder temp = new SsortingngBuilder(255); int i = GetPrivateProfileSsortingng(SECTION,name,"",temp,255,settingsPath); return temp.ToSsortingng(); } public static Ssortingng Get(Ssortingng name, Ssortingng defVal) { return Get(SECTION,name,defVal); } public static Ssortingng Get(ssortingng _SECTION, Ssortingng name, Ssortingng defVal) { SsortingngBuilder temp = new SsortingngBuilder(255); int i = GetPrivateProfileSsortingng(_SECTION, name, "", temp, 255, settingsPath); return temp.ToSsortingng(); } public static Boolean Get(Ssortingng name, Boolean defVal) { return Get(SECTION, name, defVal); } public static Boolean Get(ssortingng _SECTION, Ssortingng name, Boolean defVal) { SsortingngBuilder temp = new SsortingngBuilder(255); int i = GetPrivateProfileSsortingng(_SECTION,name,"",temp,255,settingsPath); bool retval=false; if (bool.TryParse(temp.ToSsortingng(),out retval)) { return retval; } else { return retval; } } public static int Get(Ssortingng name, int defVal) { return Get(SECTION, name, defVal); } public static int Get(ssortingng _SECTION, Ssortingng name, int defVal) { SsortingngBuilder temp = new SsortingngBuilder(255); int i = GetPrivateProfileSsortingng(SECTION,name,"",temp,255,settingsPath); int retval=0; if (int.TryParse(temp.ToSsortingng(),out retval)) { return retval; } else { return retval; } } public static void Set(Ssortingng name, Ssortingng val) { Set(SECTION, name,val); } public static void Set(ssortingng _SECTION, Ssortingng name, Ssortingng val) { WritePrivateProfileSsortingng(_SECTION, name, val, settingsPath); } public static void Set(Ssortingng name, Boolean val) { Set(SECTION, name, val); } public static void Set(ssortingng _SECTION, Ssortingng name, Boolean val) { WritePrivateProfileSsortingng(_SECTION, name, val.ToSsortingng(), settingsPath); } public static void Set(Ssortingng name, int val) { Set(SECTION, name, val); } public static void Set(ssortingng _SECTION,Ssortingng name, int val) { WritePrivateProfileSsortingng(SECTION, name, val.ToSsortingng(), settingsPath); } } 

Le stockage isolé est principalement utilisé pour les applications dissortingbuées via ClickOnce et est exécuté dans un sandbox sécurisé. Le chemin de base est décidé pour vous et vous ne pourrez pas le déduire dans votre code. Le chemin sera quelque chose comme “\ LocalSettings \ ApplicationData \ IsolatedStorage \ ejwnwe.302 \ kfiwemqi.owx \ url.asdaiojwejoieajae ….”, pas très sympathique. Votre espace de stockage est également limité.

Ryan Farley a raison .

Je vais suivre la liste des dossiers que vous avez publié à l’exception de la version du produit. Vous ne voulez pas que les parameters soient réinitialisés après la publication d’une mise à jour.

En fait, je m’éloigne du registre pour les parameters utilisateur en raison du facteur de débogage / empreinte. Je ne stocke actuellement que quelques parameters de base (taille de la fenêtre, position, version d’un fichier de données) dans le registre, et j’ai rencontré plus de problèmes si une mise à jour échouait ou si un utilisateur perdait un deuxième moniteur et l’application s’ouvrait à. Quelques-uns d’entre eux sont suffisamment avertis pour comprendre regedit, mais pour le rest ils doivent faire une réinstallation, ce qui est rapide, mais je pense qu’ils se plaignent un peu. Avec la version basée sur les fichiers, tout ce que j’ai à faire est de leur demander d’ouvrir un fichier XML dans le Bloc-notes et de faire un petit changement rapide.

De plus, je cherche à rendre mon application utilisable sur un lecteur flash USB, et les parameters liés au fichier semblent beaucoup plus conviviaux. Je suis sûr que je peux faire du code pour vérifier / nettoyer le registre, mais je pense que la plupart d’entre nous sont déjà fatigués du fouillis de registre qui semble dévorer nos machines de nos jours.

Je sais qu’il y a des compromis de sécurité à cela, mais aucune des données que je sortinge n’est aussi importante pour cette cause, et je ne subis aucune perte de performance en raison de la taille de l’application.