Laden...

*.ini mit verschiedenen Sektionen auslesen

Erstellt von JJPhoenix vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.190 Views
J
JJPhoenix Themenstarter:in
39 Beiträge seit 2008
vor 13 Jahren
*.ini mit verschiedenen Sektionen auslesen

Folgendes Szenario. Ich habe über die Comschnittstelle ein gerät ausgelsen bzw. ein RFID-Tag:

der hat ne serien nummer zum Beispiel von "chip 1"

dazu habe ich ein INI-File, in dem verschiedenene Tags definiert sind

ini-file:


[chip 1]
Bezeichnung=Standardladeschaufel
Typ=SKL85 3
Herstell_Nr=1196-10
Breite=2589
Teile_Nr=04637095007059
Betriebsdruck=0
Inhalt=1550
Gewicht=540
Traglast=1200


[chip 2]
Bezeichnung=Standardladeschaufel2
Typ=SKL85 4
Herstell-Nr.=1196-10
Breite=2200
Teile-Nr.=04637095007059
Betriebsdruck=
Inhalt=1550
Gewicht=540
Traglast=1200

[chip 3]
Bezeichnung=Standardladeschaufel3
Typ=SKL85 5
Herstell-Nr.=1196-10
Breite=2200
Teile-Nr.=04637095007059
Betriebsdruck=
Inhalt=1550
Gewicht=540
Traglast=1200

wie kann ich nun herrausfinden, ob zu dem ausgelesenen Chip eine Section in der Ini.Datei existiert?

Normales Zugreifen auf ein Value geht ja. Nur muss ich irgendwie rausbekommen OB ein eintrag existiert oder nicht, also irgendwie die Sections ansprechen.

Danke schonmal.

795 Beiträge seit 2006
vor 13 Jahren

Wie liest du denn die ini-Datei ein? Selbstgebastelt oder mit einer 3rd-Party-Bibliothek?

Gehe einfach alle Sektionen der Datei durch und vergleiche die Seriennummer.

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
P
5 Beiträge seit 2010
vor 13 Jahren

Wenn du keine fremd-Bibliotheken hast, kannst du deine ini-Datei Zeile für Zeile durchgehen, wenn ein neuer Block beginnt, notierst du den Namen in 'ne Variable und wenn dein code auf die entsprechende Nummer trifft, ist der Name des aktuellen Blocks dein gesuchter Wert.

Bevor ich irgendjemanden frage, habe ich Exzessiv mit Suchmaschinen und Foren-Suchen nach einer Lösung gefahndet.

1.820 Beiträge seit 2005
vor 13 Jahren

Hallo!

Im Forum gibt's bereits fertige Klassen, welche INI-Dateien einlesen, bearbeiten und auch wieder speichern können.

EDIT: Z.B. Ini-Datei-Klasse

Nobody is perfect. I'm sad, i'm not nobody 🙁

W
123 Beiträge seit 2008
vor 13 Jahren

Die Windows-API bietet dafür die Funktion GetPrivateProfileSectionNames.

Gruß
wolpertinger

J
JJPhoenix Themenstarter:in
39 Beiträge seit 2008
vor 13 Jahren

Ah ok danke, es war eine fertige Ini-File Klasse:

Das hier hatte ich noch einfügen müssen, jetzt bekomme ich ein Array mit den Sectionen:


        [DllImport("kernel32.dll")]
        private static extern uint GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer,
           uint nSize, string lpFileName);

gibt es da dann eine Methode, die True zurückgibt wenn ein wert sich in dem Array befindet, oder muss ich das Array mit ner Schleife durchforsten?

Sorry aber ich mache in der Regel net so viel mit c#

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo JJPhoenix,

warum kein XML? Damit wäre das ganze ein Kinderspiel.

J
JJPhoenix Themenstarter:in
39 Beiträge seit 2008
vor 13 Jahren

Hallo JJPhoenix,

warum kein XML? Damit wäre das ganze ein Kinderspiel.

Weil ich möchte dass der Kunde das Fehlerfrei editieren kann 😉

Geht so auch schon, aber vielleicht nochmal etwas kurioses: Kann es sein, daß ein Programm zu schnell arbeitet und irgendwas übersieht ? Klingt blöd, aber habe irgendwie keine Erklärung:




            String [] my_sections= ini.SectionNames();

            String sectionToFind = Reader_data.Trim();


            String my_temp_Bezeichnung = ini.ReadValue(Reader_data, "Bezeichnung", Settings_RFID_Tags.RFID_Tag.Bezeichnung);

            if (my_temp_Bezeichnung.Trim() != "")
            {
                MessageBox.Show("hatta", "BEZ");
            }

            if (((IList<string>)my_sections).Contains(sectionToFind))
            {
                Settings_RFID_Tags.Read(sectionToFind);
                //ini.ReadValue(Reader_data, "FixCode", Settings_RFID_Tags.RFID_Tag.FixCode);
                MessageBox.Show(Settings_RFID_Tags.RFID_Tag.Bezeichnung, "BEZ");
            }


warum bekomme ich immer nur eine zweite Messagebox, wenn die erste bedingung aktiv ist? Soll heissen, kommentiere ich die erste Bedingung aus, wird die zweite bedingung immer überflogen.

Wenn ich debugge, so mit Haltepunkten (VS 2008) komme ich auch in die zweite bedingung, also wenn alles schritt für schritt läuft dann gehts, bloß in einem Rutsch nicht? KOMISCH!

R
158 Beiträge seit 2007
vor 13 Jahren

🤔 Verstehe die Fragestellung nicht ganz...

Würde eher vermuten, dass diese Bedingung

if (((IList<string>)my_sections).Contains(sectionToFind))  

nicht ganz funktioniert; weil: du prüfst einen ungetrimmten Eintrag mit einem** getrimmten** Vergleichswert 😉

J
JJPhoenix Themenstarter:in
39 Beiträge seit 2008
vor 13 Jahren

Hmm nee, weil mit nem Sleep bekomme ich die Erfüllte bedingun, aber ohne leider nicht:


            Thread.Sleep(250);


            if (((IList<string>)my_sections).Contains(sectionToFind))
            {
                Settings_RFID_Tags.Read(sectionToFind);
                //ini.ReadValue(Reader_data, "FixCode", Settings_RFID_Tags.RFID_Tag.FixCode);
                MessageBox.Show(Settings_RFID_Tags.RFID_Tag.Bezeichnung, "BEZ");
            }

Hinweis von herbivore vor 13 Jahren

Bitte verwende für C#-Code die [****CSHARP]-Tags. Die [****CODE]-Tags sind nur für Code in anderen Sprachen. Ich habs in diesem Thread an allen Stellen korrigiert.