Lecture du fichier ini en C #

J’essaie de lire un fichier ini au format suivant:

SETTING=VALUE SETTING2=VALUE2 

J’ai actuellement le code suivant:

 ssortingng cache = sr.ReadToEnd(); ssortingng[] splitCache = cache.Split(new ssortingng[] {"\n", "\r\n"}, SsortingngSplitOptions.RemoveEmptyEnsortinges); 

Ce qui me donne une liste de parameters, cependant, ce que je voudrais faire est de le lire dans un dictionnaire. Ma question est la suivante: y a-t-il un moyen de faire cela sans parcourir le tableau en entier et remplir manuellement le dictionnaire?

Eh bien, vous pouvez utiliser LINQ et faire

 Dictionary ini = (from entry in splitCache let key = entry.Subssortingng(0, entry.FirstIndexOf("=")) let value = entry.Subssortingng(entry.FirstIndexOf("=")) select new { key, value }).ToDictionary(e => e.key, e => e.value); 

Comme le souligne Binary Worrier dans les commentaires, cette façon de faire n’a aucun avantage par rapport à la simple boucle suggérée par les autres réponses.

Edit: Une version plus courte du bloc ci-dessus serait

 Dictionary ini = splitCache.ToDictionary( entry => entry.Subssortingng(0, entry.FirstIndexOf("="), entry => entry.Subssortingng(entry.FirstIndexOf("=")); 

Quel est le problème avec itérer?

 var lines = File.ReadAllLines("pathtoyourfile.ini"); var dict = new Dictionary(); foreach(var s in lines) { var split = s.Split("="); dict.Add(split[0], split[1]); } 

Il y a en fait une API Windows pour lire / écrire des fichiers INI dans kernel32.dll ; voir cet article CodeProject pour un exemple.

Les fichiers INI sont un peu délicats, je vous déconseille donc de les lancer vous-même. J’ai écrit Nini qui est une bibliothèque de configuration qui inclut un parsingur syntaxique très rapide.

Exemple de fichier INI:

 ; This is a comment [My Section] key 1 = value 1 key 2 = value 2 [Pets] dog = rover cat = muffy 

Même code C #:

 // Load the file IniDocument doc = new IniDocument ("test.ini"); // Print the data from the keys Console.WriteLine ("Key 1: " + doc.Get ("My Section", "key 1")); Console.WriteLine ("Key 2: " + doc.Get ("Pets", "dog")); // Create a new section doc.SetSection ("Movies"); // Set new values in the section doc.SetKey ("Movies", "horror", "Scream"); doc.SetKey ("Movies", "comedy", "Dumb and Dumber"); // Remove a section or values from a section doc.RemoveSection ("My Section"); doc.RemoveKey ("Pets", "dog"); // Save the changes doc.Save("test.ini"); 

Essayez comme ça

 [DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileSsortingng")] public static extern int GetPrivateProfileSsortingng(ssortingng SectionName, ssortingng KeyName, ssortingng Default, SsortingngBuilder Return_SsortingngBuilder_Name, int Size, ssortingng FileName); 

et appeler la fonction comme ça

 GetPrivateProfileSsortingng(Section_Name, "SETTING", "0", SsortingngBuilder_Name, 10, "filename.ini"); 

La valeur est accessible à partir de SsortingngBuilder_Name .

Pourquoi ne pas lire le fichier sous forme de lignes séparées, puis boucler dessus en séparant le premier = ?

 var dict = new Dictionary(); foreach (var line in File.ReadAllLines(filename)) { var parts = line.Split('=', 2); // Maximum of 2 parts, so '=' in value ignored. dict.Add(parts[0], parts[1]); } 

(Dans .NET 4, remplacez ReadAllLines par ReadLines . Pour éviter de créer le tableau, ReadLines renvoie IEnumerable et lit le fichier paresseusement.)