Comment faire pour enregistrer les paramètres de l'application dans une Application Windows Forms?
Ce que je veux réaliser est très simple: j'ai un Windows Forms (.NET 3.5) de l'application qui utilise un chemin d'accès pour la lecture de l'information. Ce chemin d'accès peut être modifié par l'utilisateur, en utilisant les options de formulaire que j'offre.
Maintenant, je veux sauver le chemin d'accès à un fichier pour une utilisation ultérieure. Ce serait un des nombreux paramètres enregistrés dans ce fichier. Ce fichier s'asseoir directement dans le dossier de l'application.
Je comprends trois options sont disponibles:
- ConfigurationSettings fichier (appname.exe.config)
- Registre
- Fichier XML personnalisé
J'ai lu que la .NET fichier de configuration n'est pas prévu pour l'enregistrement des valeurs de revenir.
Comme pour le registre, je voudrais aller aussi loin d'elle que possible.
Est-ce à dire que je devrais utiliser un fichier XML personnalisé pour enregistrer les paramètres de configuration?
Si oui, je voudrais voir exemple de code de C#).
J'ai vu d'autres discussions sur ce sujet, mais il n'est pas encore clair pour moi.
- Est-ce un .NET WinForms application? Si oui, quelle version de .NET allez-vous développer sur?
- Oui, il est un .NET framework version 3.5 application WinForms.
- avez-vous besoin d'enregistrer mots de passe ou les secrets des valeurs ? Peut-être que nécessite tout de chiffrement
Vous devez vous connecter pour publier un commentaire.
Si vous travaillez avec Visual Studio, alors il est assez facile d'obtenir des permanent des paramètres. Clic droit sur le projet dans l'Explorateur de solutions, cliquez sur Propriétés. Sélectionnez l'onglet Paramètres, cliquez sur le lien hypertexte si les paramètres n'existe pas. Utilisez l'onglet Paramètres pour créer des paramètres de l'application. Visual Studio crée les fichiers
Settings.settings
etSettings.Designer.settings
qui contiennent de la classe singletonSettings
hérité de ApplicationSettingsBase. Vous pouvez accéder à cette classe à partir de votre code de lecture/écriture des paramètres de l'application:Cette technique est applicable à la fois pour la console, Windows Forms et d'autres types de projet.
Noter que vous devrez régler la portée propriété de vos paramètres. Si vous sélectionnez l'Application puis sur Paramètres.Par défaut.< votre propriété > sera en lecture seule.
Settings.Default.Save()
méthode ne fait rien. Vous devez utiliser un autre fournisseur. Voir: geek-republic.com/2010/11/08/c-portable-settings-providerSettings.Default.SomeProperty = 'value'; Settings.Default.Save();
fonctionne comme un charme. Ou est-ce parce que j'ai les paramètres Utilisateur?Settings.Default.Save()
ne fait rien est incorrect. Comme @aku unis dans la réponse, app-champ d'application les paramètres sont en lecture seule: l'enregistrement est inefficace pour eux. Utiliser custom PortableSettingsProvider pour économiser de l'utilisateur-champ d'application les paramètres de l'application.config où se situe le fichier exe est à la place de celui de l'utilisateur dans le dossier AppData. Non, pas bonne en général, mais je l'utilise en cours de développement à utiliser les mêmes paramètres de compilation pour compiler (w/o, elles vont uniques dossiers de l'utilisateur à chaque compilation).Si vous prévoyez sur l'enregistrement d'un fichier dans le même répertoire que l'exécutable, voilà une belle solution qui utilise le JSON format:
DEFAULT_FILENAME
, il suffit d'appelersettings.Save(theFileToSaveTo)
; le fait d'Être tous les chapeaux,DEFAULT_FILENAME
est censé être un constant. Si vous voulez une propriété en lecture-écriture, faire un et ont le constructeur défini àDEFAULT_FILENAME
. Alors l'argument par défaut de la valeurnull
, le tester et l'utilisation de vos biens, la valeur par défaut. C'est un peu plus saisissant, mais vous offre une interface standard.System.Web.Extensions.dll
si vous ne l'avez pas déjà.Le registre est un no-go. Vous n'êtes pas sûr de savoir si l'utilisateur qui utilise votre application, dispose de suffisamment de droits pour écrire dans le registre.
Vous pouvez utiliser le
app.config
fichier à enregistrer au niveau de l'application des paramètres (qui sont les mêmes pour chaque utilisateur qui utilise votre application).Je serait de stocker les paramètres spécifiques à l'utilisateur dans un fichier XML, ce qui serait enregistré dans Le Stockage Isolé ou dans le SpecialFolder.ApplicationData répertoire.
À côté de cela, comme de .NET 2.0, il est possible de stocker des valeurs de retour de la
app.config
fichier.SettingsProvider
comme celui-ci: PortableSettingsProvider.La
ApplicationSettings
classe ne prend pas en charge l'enregistrement des paramètres de l'application.fichier de configuration. C'est très bien de par leur conception, les applications qui s'exécutent correctement sécurisé de compte d'utilisateur (pensez UAC de Vista) n'ont pas d'accès en écriture pour le programme d'installation du dossier.Vous pouvez combattre le système avec le
ConfigurationManager
classe. Mais la simple solution consiste à aller dans les Paramètres de designer et de modifier le réglage de la portée de l'Utilisateur. Si cela cause des difficultés (par exemple, le paramètre est pertinent pour chaque utilisateur), vous devez placer vos Options de fonctionnalité dans un programme distinct de sorte que vous pouvez demander pour avoir le privilège de l'invite d'élévation. Ou renoncer à l'utilisation d'un paramètre.Je voulais partager une bibliothèque que j'ai construit pour cela. C'est une petite bibliothèque, mais une grande amélioration (à mon humble avis) de plus .les fichiers de paramètres.
La bibliothèque est appelée Iota (GitHub), voici une vieille Le Projet de Code de l'article j'ai écrit à ce sujet.
Voici comment vous pouvez utiliser pour garder une trace d'une fenêtre de la taille et de l'emplacement:
L'avantage par rapport à .les fichiers de paramètres: Il y a beaucoup moins de code, et c'est beaucoup moins sujettes à l'erreur puisque vous n'avez qu'à mentionner chaque propriété une fois.
Avec un des fichiers de paramètres, vous devez mentionner chaque propriété cinq fois: une fois lorsque vous créez explicitement la propriété et quatre autres fois dans le code qui copie les valeurs d'avant en arrière.
De stockage, la sérialisation, etc. sont entièrement configurables. Lorsque la cible objets sont créés par un conteneur IOC, vous pouvez [connecter][] de sorte qu'il s'applique suivi automatiquement à tous les objets qu'il résout, de sorte que tout ce que vous devez faire pour faire une propriété persistante est une claque [Suivi de] attribut.
Il est hautement configurable, vous pouvez configurer:
- lorsque les données sont enregistrées et appliquées globalement ou pour chaque objet suivi
- comment c'est sérialisé
- où il est stocké (par exemple, fichier, base de données, en ligne, le stockage isolé, registre)
- les règles qui peuvent annuler l'application/de conservation de données pour une propriété
Confiance en moi, la bibliothèque est au top!
Le registre/configurationSettings/XML argument semble encore très active. J'ai tout utilisé, comme la technologie a progressé, mais mon préféré est basé sur Threed du système combiné avec Le Stockage Isolé.
L'exemple suivant permet de stocker des objets dans les propriétés nommées dans un fichier de stockage isolé. Tels que:
Propriétés peuvent être récupérés à l'aide de:
C'est juste un exemple, et non pas des suggestions de bonnes pratiques.
Un moyen simple est d'utiliser une configuration de données de l'objet, de l'enregistrer comme un fichier XML avec le nom de l'application dans le Dossier local et au démarrage le lire.
Voici un exemple pour stocker la position et la taille d'un formulaire.
La configuration dataobject est fortement typé et facile à utiliser:
Un gérant de classe pour la sauvegarde et le chargement:
Maintenant, vous pouvez créer une instance et l'utilisation en charge de votre formulaire et de fermer les événements:
Et le produit de fichier XML est également lisible:
c:\program files\my application
dossier, de sorte que l'enregistrement des paramètres déclenche une erreur. Je suis à la recherche en économie dans le fichier xml dans AppData à la place, mais je me demandais si il y avait une façon évidente autour de ce problème, puisque cette approche semble avoir fonctionné pour vous.Je n'aime pas la proposition de solution à l'aide de
web.config
ouapp.config
. Essayez de lire votre propre XML. Jetez un oeil à XML des Fichiers de Paramètres, plus web.config.D'autres options, au lieu d'utiliser un fichier XML personnalisé, nous pouvons utiliser une interface utilisateur plus conviviale format de fichier: JSON ou YAML.
(sérialiser, désérialiser, objets imbriqués de soutien et de commande de sortie
comme vous le souhaitez + la fusion de plusieurs paramètres à un) JsonConfig (l'usage est l'équivalent de ApplicationSettingsBase)
facile à utiliser comme JsonConfig
Vous pouvez stocker votre fichier de settings dans plusieurs dossiers spéciaux (pour tous les utilisateurs et par utilisateur) comme indiqué ici De l'environnement.SpecialFolder Énumération et plusieurs fichiers (par défaut en lecture seule, par rôle, par l'utilisateur, etc.)
%AppData%
Si vous choisissez d'utiliser plusieurs paramètres, vous pouvez fusionner ces paramètres: Par exemple, la fusion des paramètres par défaut + BasicUser + AdminUser. Vous pouvez utiliser vos propres règles: le dernier remplace la valeur, etc.
"Est-ce à dire que je devrais utiliser un fichier XML personnalisé pour enregistrer les paramètres de configuration?" Non, pas nécessairement. Nous utilisons SharpConfig pour de telles opérations.
Par exemple, si le fichier de config est comme ça
Il est possible d'extraire des valeurs de ce type
Il est compatible avec .Net 2.0 et plus. Nous pouvons créer des fichiers de configuration à la volée et nous pouvons l'enregistrer plus tard.
Source: http://sharpconfig.net/
Github: https://github.com/cemdervis/SharpConfig
J'espère que cela aide.
Autant que je peux dire .NET prend en charge la persistance des paramètres en utilisant l'application intégrée des paramètres de l'installation:
Parfois, vous voulez vous débarrasser de ces paramètres conservés dans le web traditionnel.config ou app.fichier de configuration. Vous voulez plus de précision, de contrôler le déploiement de vos paramètres et les entrées de données séparées de la conception. Ou l'exigence est de permettre l'ajout de nouvelles entrées au moment de l'exécution.
Je peux imaginer deux bonnes options:
L'avantage de fortement typé version sont fortement typés paramètres de noms et de valeurs. Il n'y a pas de risque de mélange ou de noms de types de données. L'inconvénient est que plusieurs paramètres doivent être codés, ne peut pas être ajouté au moment de l'exécution.
Avec la version orientée objet l'avantage est que les nouveaux paramètres peuvent être ajoutés au moment de l'exécution. Mais vous n'avez pas fortement typé noms et les valeurs. Devez être prudent avec les identifiants de chaîne. Doit connaître le type de données enregistrées plus tôt lors de l'obtention d'une valeur.
Vous pouvez trouver le code de pleinement fonctionnel implémentations ICI.