AnaXyd Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 Ach, før jeg spør mye her nå... Håper jeg er tilgitt! Jeg driver å skal la programmet mitt instille seg, i forhold til en .txt fil (egentlig .ini) La meg vise koden: 'Check if the options has been set If System.IO.File.Exists("c:\options.ini") Then Dim file As New System.IO.StreamReader("c:\options.ini") Dim oneLine As String oneLine = file.ReadLine() If oneLine = "Ini? = Yes" Then MessageBox.Show("Working..!") 'Bare for å sjekke om at koden funker If oneLine = "" Then [COLOR=green]'<---- Her må det noe inn[/COLOR] Else End If Else MessageBox.Show("It seems that the options file has been corrupted. Please run the wizard again!") End If Else : MessageBox.Show("Your settings has not been set yet. Please run the Wizard!") End If End Sub .ini fila ser slik ut innvendig: Ini? = YesFW = 2.0 MB = TA-082 or above VE = UK ###################### Så, jeg får jo til å lese fra første linja.. Men hvordan skal jeg f.eks få til å lese akkurat fra linje 3? (MB = TA-082 or above) Setter pris på alle svar! Lenke til kommentar
GeirGrusom Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 (endret) Do Dim line As String = file.ReadLine() If line Is Nothing Then Exit Do Dim pos As Integer = line.IndexOf("=") If pos = -1 Then Throw New Exception("Invalid INI file format") Dim line_start As String = line.SubString(0, pos - 1).Trim() Dim line_end As String = line.SubString(pos + 1).Trim() ' line_start er nå det som står foran = ' line_end er nå det som står etter = Loop Endret 5. juli 2007 av GeirGrusom Lenke til kommentar
AnaXyd Skrevet 5. juli 2007 Forfatter Del Skrevet 5. juli 2007 Kan du forklare litt hvordan den der fungerer..? Lenke til kommentar
j000rn Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 (endret) Kan du forklare litt hvordan den der fungerer..? 9007629[/snapback] Bedre forslag; Prøv å kommentere den selv. Og så poster du koden her med kommentarer. Så kan vi komme med tilbakemelding. Dermed får du litt trening på å lære å lese kode selv, samtidig som vi får luket ut eventuelle feil som du gjør. Endret 5. juli 2007 av jorn79 Lenke til kommentar
aadnk Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 (endret) Jeg har forsøkt å kommentere noe, men det er jo begrenset hva en kan forklare på såpass få linjer. Jeg er for øvrig enig med jorn79 - prøv først selv! Klikk for å se/fjerne innholdet nedenfor Do ' Hent den neste linjen Dim line As String = file.ReadLine() ' Se om linjen ikke er satt (dette inntreffer når vi har nådd slutten av filen) If line Is Nothing Then Exit Do ' Gå til linjen NEDENFOR Loop-nøkkelordet ' Se hvilken posisjon "="-karakteren har Dim pos As Integer = line.IndexOf("=") ' Dersom den ikke eksisterer, er INI-formatet ungyldig If pos = -1 Then Throw New Exception("Invalid INI file format") ' Hent all tekst FØR "="-karakteren. I tillegg fjerner vi all unødvendig mellomrom Dim line_start As String = line.Substring(0, pos - 1).Trim() ' Hent all tekst ETTER "="-karakteren. Dim line_end As String = line.Substring(pos + 1).Trim() ' line_start er nå det som står foran = ' line_end er nå det som står etter = ' Hopper tilbake til Do-nøkkelordet helt til topps Loop For øvrig ville jeg selv gjort dette på følgende måte: Klikk for å se/fjerne innholdet nedenfor Public Function ReadIni(ByVal File As String) As Dictionary(Of String, String) ' Det er ofte lurt å la inndata være en Stream da det muliggjør for langt mer ' fleksibel prossering (kryptering, komprimering, minne-lagring, nettverk, ect.) Using sFile As New IO.FileStream(File, IO.FileMode.Open) ' Åpner filen ReadIni = ReadIni(sFile) End Using ' Her kalles Dispose automatisk End Function Public Function ReadIni(ByVal Stream As IO.Stream) As Dictionary(Of String, String) ' Strømleseren (håndterer karaktersett (ANSI i dette tilfellet) og linjeterminering) Dim Reader As New IO.StreamReader(Stream, System.Text.Encoding.Default) Dim Line As String, Parts() As String ' Gjør klar returobjektet (Dictionary med strengnøkler og strengverdier) ReadIni = New Dictionary(Of String, String) ' Gjenta koden inntil vi har nådd slutten (ReadLine returnerner Nothing i så fall) Do Until TryGet(Reader.ReadLine, Line) Is Nothing ' Split deler opp linjen der "=" befinner seg. Oppdelingen er begrenset til ' maksimalt to deler, og vi sjekker hvorvidt vi har begge før vi fortsetter. If TryGet(Split(Line, "=", 2), Parts).Length = 2 Then ' Legg til nøkkel (navn på variabel - det som kommer før =) og verdi ReadIni.Add(Parts(0).Trim, Parts(1).Trim) End If Loop End Function ' Liten og lur funksjon som gjør det mulig å presse flere linjer sammen til én. Private Function TryGet(Of T)(ByVal Value As T, ByRef Storage As T) As T Storage = Value : Return Value End Function Fordelen er da at du enkelt kan hente ut hvert verdisett uten å måtte tenke på rekkefølgen: Dim IniFile As Dictionary(Of String, String) = ReadIni("C:\Test.ini")Dim Index As Integer ' Hent en viss verdi MessageBox.Show(IniFile("hallo")) ' Hent det tredje elementet For Each Item As String In IniFile.Values If Index = 2 Then MessageBox.Show(Item) Index += 1 Next Den beste metoden er imidlertid å benytte de innebyggede APIene for å lese og skrive til INI-filer. Det er nemlig ikke alltid slik at INI-filene er lagret på harddisken - ofte kan de være lagret i en hurtibuffer (minnet eller registeret), og det tar ikke koden ovenfor hensyn til. Du kan finne en implementasjon for VB.net her. Endret 5. juli 2007 av aadnk Lenke til kommentar
aadnk Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 Jeg driver å skal la programmet mitt instille seg, i forhold til en .txt fil (egentlig .ini) 9007028[/snapback] Jeg tar dette med APIene tilbake. Den beste måten er utvilsomt å bruke den innebyggede innstillingskomponenten i Visual Studio. Gå til My Project -> Settings. Legg til alle innstillingene programmet behøver ved å skrive inn dets navn under Name, type (om det er tekst, tall, sannhet, ect.) under Type, Scope til Application om du vil innstillingen skal være Read-Only samt standardverdi under Value. For å bruke disse innstillingene, bruker du My.Settings-navneområdet: ' Sett en verdiMy.Settings.Test = "Hallo verden!" ' Hent verdi MessageBox.Show(My.Settings.Test) Enklere kan det nesten ikke bli. Lenke til kommentar
GeirGrusom Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 Det kan innimellom være hendig å bruek ini filer også, ikke nødvendigvis til programinstillinger, men til andre ting, fortrinnsvis fordi .ini filer er enklere å forstå en XML filer. Lenke til kommentar
aadnk Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 (...) men til andre ting, fortrinnsvis fordi .ini filer er enklere å forstå en XML filer. 9008592[/snapback] Enig i den, ja. Det er nokså irriterende at Microsoft har totalt oversett INI-filer til fordel for XML i .NET, kun for buzzword-kompatibilitet og utfasing av et helt kurant format. Det hele ligner en besettelse, spør du meg. Lenke til kommentar
j000rn Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 Enig i den, ja. Det er nokså irriterende at Microsoft har totalt oversett INI-filer til fordel for XML i .NET, kun for buzzword-kompatibilitet og utfasing av et helt kurant format. Det hele ligner en besettelse, spør du meg. 9008638[/snapback] Konfigurasjonsfiler er jo faktisk en av de få tingene XML er egnet for... Lenke til kommentar
aadnk Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 (endret) Konfigurasjonsfiler er jo faktisk en av de få tingene XML er egnet for... 9008690[/snapback] Nja, hvor mye tjener en egentlig på å konvertere til XML? Når alt kommer til alt er begge tekstformater (en må derfor inn med ekstra tolking for å støtte flere datatyper), og standardisert til den grad de er implementert på noenlunde samme måte (via et API). Joda, XML er langt mer allsidig og kan lagre mer komplekse strukturer enn INI, men for en enkelt tekstnøkkel-basert konfigurasjonsfil (med seksjoner) er mer enn det neppe nødvendig. Men såklart, manglende støtte for INI-filer er et problem. I alle tilfeller tror jeg du bør lese innlegget mtt igjen. Jeg erkjente kun at INI-filer var lettere å forstå enn XML, og at XML i seg selv er generelt sett overhypet. Endret 5. juli 2007 av aadnk Lenke til kommentar
j000rn Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 Konfigurasjonsfiler er jo faktisk en av de få tingene XML er egnet for... 9008690[/snapback] Nja, hvor mye tjener en egentlig på å konvertere til XML? Når alt kommer til alt er begge tekstformater (en må derfor inn med ekstra tolking for å støtte flere datatyper), og standardisert til den grad de er implementert på noenlunde samme måte (via et API). Joda, XML er langt mer allsidig og kan lagre mer komplekse strukturer enn INI, men for en enkelt tekstnøkkel-basert konfigurasjonsfil (med seksjoner) er mer enn det neppe nødvendig. Manglende støtte er selvsagt et problem, I alle tilfeller tror jeg du bør lese innlegget mtt igjen. Jeg erkjente kun at INI-filer var lettere å forstå enn XML, og at XML i seg selv er generelt sett overhypet. 9009077[/snapback] Har du sett på hvor mange ting man kan konfigurere i .Net? Vi snakker ikke lengre om "enkle" konfigurasjonsfiler. Vi snakker ikke lengre om bare seksjoner, men mange nivåer av seksjoner. Og mange nivåer av konfigurasjonsfiler. Noen filer kan override visse seksjoner, etc. Dette skal også valideres. XML støtter allerede alt dette. .Config filene er også ment til en viss grad å erstatte registry. Men vi er begge enige i at XML er overhypet Lenke til kommentar
AnaXyd Skrevet 5. juli 2007 Forfatter Del Skrevet 5. juli 2007 (endret) Jeg driver å skal la programmet mitt instille seg, i forhold til en .txt fil (egentlig .ini) 9007028[/snapback] Jeg tar dette med APIene tilbake. Den beste måten er utvilsomt å bruke den innebyggede innstillingskomponenten i Visual Studio. Gå til My Project -> Settings. Legg til alle innstillingene programmet behøver ved å skrive inn dets navn under Name, type (om det er tekst, tall, sannhet, ect.) under Type, Scope til Application om du vil innstillingen skal være Read-Only samt standardverdi under Value. For å bruke disse innstillingene, bruker du My.Settings-navneområdet: ' Sett en verdiMy.Settings.Test = "Hallo verden!" ' Hent verdi MessageBox.Show(My.Settings.Test) Enklere kan det nesten ikke bli. 9008520[/snapback] Jeg må si at My.Settings greia var mye enklere! Men, tror jeg kommer til å bruke .ini filer litt også... Skal se om jeg får til de funksjonene dere har postet til meg! Tusen takk for svar! Jeg lurer på en ting, disse My.Settings greiene, lagrer det seg i selve programmet mitt eller som egen fil? Endret 5. juli 2007 av AnaXyd Lenke til kommentar
Degeim Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 (endret) Jeg har ikke mulighet til å teste nå, men du kan jo legge programfilen din (kun .exe-filen) i en egen mappe, starte den, gjøre noe som vil føre til at innstillingene blir lagret, og så se om det kom en ekstra fil i mappen. Endret 5. juli 2007 av Degeim Lenke til kommentar
AnaXyd Skrevet 5. juli 2007 Forfatter Del Skrevet 5. juli 2007 Testet akkurat nå, og det ser ut som det lagrer seg i selve programmet. Noe som er veldig kjekt! Da blir det bare enklere i bruk også.. Lenke til kommentar
aadnk Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 Nja, innstillingene lagres i [navn på applikasjon].exe.config, om jeg ikke tar feil, og uansett er det høyst usannsynlig at EXE-filen modifisere seg selv (den blir automatisk låst når programmet kjøres). Lenke til kommentar
AnaXyd Skrevet 5. juli 2007 Forfatter Del Skrevet 5. juli 2007 Det var da aldeles merkelig, for jeg la den på skrivebordet og kjørte den. Mulig den skrev til en config fil i sitt tidligere hjem? (Inni Visual Studio Projects) Lenke til kommentar
Spartakus Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 Det der har jeg lurt på også, hvor i all verden lagrer innstillingene seg? Lenke til kommentar
aadnk Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 Har lett litt på MSDN (blogg) nå, og jeg tror brukerdefinerte innstillinger (den jeg nevnte tidligere angår applikasjonsinnstillinger - altså de som kun er lesbare) lagres i en user.config-fil, som regel etsteds i følgende mappe: C:\Documents and Settings\<username>\Application Data\<company>\<exe-name><hash values>\<version>\user.config Men filene ser ikke ut til å inneholde noe spesielt. Merkelige greier. Lenke til kommentar
Manfred Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 Det er vel noe av poenget, at ikke disse skal være så lett tilgjengelige... Lenke til kommentar
Degeim Skrevet 5. juli 2007 Del Skrevet 5. juli 2007 Hvorfor er det et poeng? Er ikke poenget å ha en enkel måte å lagre og hente ut innstillinger på? Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå