Dateiarbeit

  • Servous,

    ich hab ein kleines Problemchen, leider fand ich bei Google nicht so wirklich die Atemberaubende Beispiele und die AutoIt Hilfe stand auch nicht so das wahre drinne, sodass ich euch frage.

    Es geht ums Thema Dateiarbeit.
    Ich habe bis jetzt in die .txt mit FileWrite gearbeitet ohne das der Nutzer via FileSaveDialog einen eigenen Namen ausdenken konnte.

    Jetzt würde ich gerne wissen, wie ich via FileOpenDialog aus eine Datei lesen kann und die Werte in die verschiedene Inputs, Edits und ComboBoxen übertragen lassen könnte.

    Danke im Vorraus

    grüße myrix

    Es gibt keine blöde Fragen, es gibt nur blöde antworten !

    Einmal editiert, zuletzt von myrix (9. Juni 2011 um 18:33)

  • Wenn ich dich richtig verstanden hab... hät ich hier ein beispiel:

    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 447, 192, 124)
    $Button1 = GUICtrlCreateButton("Button1", 67, 125, 410, 146, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $Button1
    $path= fileopendialog("Hallo", "Arbeitsplatz", "(*.txt)")
    $file= Fileopen($path)
    fileclose($file)
    $text= Fileread($path)

    ; Guictrlsetdata($edit1, $text)

    EndSwitch
    WEnd

    [/autoit]


    und btw.. warum txt und nicht ini?

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble

  • An ini hab ich auch schon gedacht, ich dachte mit die txt variante wäre die "klassische".

    Nur so nebenbei bei mir kommt: "Unbalanced brackets in expression.:"

    Es gibt keine blöde Fragen, es gibt nur blöde antworten !

  • Danke dir erstmal Twodollarbillie nachträglich,

    ich habe ein anderes Problemchen, was ist wenn ich viele viele Variablen in der .ini/.txt habe die in verschiedenen Inputs geladen werden sollen?
    z.B.

    [autoit]

    $GepeichertTitel = "ein titel" ; soll in die Input1
    $GepeichertSynomyme = "Ruheort, Entspannung" ; soll in die Input2
    $GepeichertJahr = "12345678" ; soll in die Input2
    $GepeichertBilder = "bild" ; soll in die Edit1

    [/autoit]


    Passendes Programm dafür:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 492, 315, -1, -1)
    $Edit1 = GUICtrlCreateEdit("", 16, 96, 217, 209)
    $Edit2 = GUICtrlCreateEdit("", 248, 96, 217, 209)
    GUICtrlSetData(-1, "")
    $Input1 = GUICtrlCreateInput("", 16, 8, 121, 21)
    $Input2 = GUICtrlCreateInput("", 16, 40, 121, 21)
    $Input3 = GUICtrlCreateInput("", 144, 8, 121, 21)
    $Input4 = GUICtrlCreateInput("", 144, 40, 121, 21)
    $Button1 = GUICtrlCreateButton("laden", 400, 8, 75, 25)
    $Button4 = GUICtrlCreateButton("speichern", 272, 8, 121, 21)
    $Button3 = GUICtrlCreateButton("3", 272, 40, 121, 21)
    $Button2 = GUICtrlCreateButton("4", 400, 40, 75, 25)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $Button1
    $path= fileopendialog("Hallo", @ScriptDir, "(*.ini)")
    $file= Fileopen($path)
    fileclose($file)
    $text= Fileread($path)
    Guictrlsetdata($Input4, $text)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit]

    Danke im vorraus

    Es gibt keine blöde Fragen, es gibt nur blöde antworten !

  • Hey.

    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 492, 315, -1, -1)
    $Edit1 = GUICtrlCreateEdit("", 16, 96, 217, 209)
    $Edit2 = GUICtrlCreateEdit("", 248, 96, 217, 209)
    GUICtrlSetData(-1, "")
    $Input1 = GUICtrlCreateInput("", 16, 8, 121, 21)
    $Input2 = GUICtrlCreateInput("", 16, 40, 121, 21)
    $Input3 = GUICtrlCreateInput("", 144, 8, 121, 21)
    $Input4 = GUICtrlCreateInput("input 4", 144, 40, 121, 21)
    $Button1 = GUICtrlCreateButton("laden", 400, 8, 75, 25)
    $Button4 = GUICtrlCreateButton("speichern", 272, 8, 121, 21)
    $Button3 = GUICtrlCreateButton("3", 272, 40, 121, 21)
    $Button2 = GUICtrlCreateButton("4", 400, 40, 75, 25)
    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $Button1
    $path= fileopendialog("Hallo", @ScriptDir, "(*.ini)")
    ;$file= Fileopen($path)
    ;fileclose($file)
    $text1= IniRead ( $path, "1", "1", "error" )
    Guictrlsetdata($Input4, $text1)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    EndSwitch
    WEnd

    [/autoit]

    Ich hoffe, du kannst es so umsetzen.
    Wäre kompett mit Ini's.

    Das mit dem $file ...versteh ich nicht, wieso das Prog es öffnen & schließen soll?


    xxx.ini im Anhang, damit du es auch testen kannst, anschauen kannst.

    Musste ich leider zippen, *.ini Dateien hochzuladen ist nicht erlaubt.

  • Stell dir vor du öffnest ein Buch und liest bissel drinne rum. Wenn du es nicht mehr brauchst klappste es zu [fileclose($file)] und das Buchtzklappen macht der fehl das .
    Wenn du ein Buch/Datei öffnest solltest du es auch wieder schließen bevor sich Fehler einschließen

    Es gibt keine blöde Fragen, es gibt nur blöde antworten !

  • Zitat

    An ini hab ich auch schon gedacht, ich dachte mit die txt variante wäre die "klassische".

    Für viele Daten etc würde ich in der Regel immer eine *.ini nehmen, da man dort sehr schön mit Sections, Verten und Keys arbeiten kann. *.txt Dateien würde ich hautpsächlich dann benutzen wenn man nur wenig Daten speichern muss oder einfach nur Texte, da man ansonsten alle Werte aus der .txt filtern muss, wenn man es nicht mit FileWriteLine einließt. Beispiel: Vokabeltrainer, dafür würde ich immer eine *.ini benutzen weil du schön die Section als Lektion benutzen kannst, den Wert bzw den Schlüssel als Fremdwort und den Schlüssel bzw den Wert als deutsches Wort.

    Beispiel:

    [Lektion 1]
    Apfel=apple

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Oder man nimmt die Registry...schneller & sicherer (gg Leute, die sich nicht auskennen :D)

    Ähm.. klar, dass das File geschlossen werden soll. Aber:
    Öffnest du ein Buch, um es dann wieder, sofort, zu schließen? Ich hätt's ja verstanden, wenn da drin was gemacht wird, beim Buch wird ja gelesen, aber direkt wieder schließen..?


  • Das sollte man bei einer größeren Anzahl Daten aber unterlassen... Sonst wird die Registry zugemüllt.


    Könnte man beim Schließen des Programms wieder löschen lassen.

  • Ööööööm die Daten in die Registry zu schreiben finde ich an dieser Stelle bissel für sinnfrei. Ich zum Beispiel hab eine DR Kaiser Recovery Card im Rechner da wären die Daten/Einträge weg. Da wäres doch schon besser wenn man die in eine ini/txt speichern täte und von dort aussliest

    Es gibt keine blöde Fragen, es gibt nur blöde antworten !

  • Um nochmal auf diese 3 Zeilen von TwoDollarBilie zurückzukommen:

    [autoit]


    $file= Fileopen($path)
    fileclose($file)
    $text= Fileread($path)

    [/autoit]

    Wenn man fileopen verwendet gibt man keinen Dateipfad bei fileread an, ausserdem wäre es wohl angebracht die Datei erst nach dem lesen zu schliessen. ;)

    Die Funktion fileread akzeptiert sowohl Dateipfade als auch Dateihandles. Wenn man nur einen Pfad angibt wird automatisch ein fileopen und fileclose ausgeführt. Deswegen wäre ein manuelles fileopen garnicht notwendig.
    Fileopen verwendet man insbesondere dann wenn mehrmals in die Datei geschrieben oder aus ihr gelesen werden soll, dadurch muss die fileread Funktion nicht mehr jedesmal die Datei öffnen und schliessen. In einer Schleife mit 100 Durchgängen spart man sich durch die Nutzung eines Handles also 99 open und close Vorgänge wenn man mit einem Handle anstelle des Pfades arbeitet.

    Richtig wäre es also so angewendet:

    [autoit]


    $handle = Fileopen($path)
    $text = Fileread($handle)
    fileclose($handle)

    [/autoit]

    Sinn würde es aber nur machen wenn man mehrmals hintereinander aus der Datei liest oder in die Datei schreibt, bevor sie geschlossen wird. Fileopen benutzt man ausserdem wenn man einen bestimmten Schreib oder Lesemodus ( Binär oder UTF8/16 ) benötigt.

  • Mit FileRead(Line) komme ich noch nicht so ganz klar.

    [autoit]

    $oeffnen = FileOpen(".\Vorlagen\abc.txt")
    $bla = FileRead($oeffnen)
    $bla2= FileReadLine($bla, $variablenname2)
    MsgBox(0,"",$bla2)

    [/autoit]

    Wenn es funktionieren täte, dächte ich an folgendes um den Wert an ein Edit/Inputbox zu bekommen

    [autoit]

    GuiCtrlSetData($InputFeld, FileReadLine($bla, $variablenname2)

    [/autoit]


    Danke im Vorraus

    mfg myrix

    Es gibt keine blöde Fragen, es gibt nur blöde antworten !

  • So vielleicht?!?

    [autoit]


    $Zeile = 1
    $file = FileOpen(@scriptdir & "\Vorlagen\abc.txt", 0)
    $bla2= FileReadLine($file ,$Zeile)
    FileClose($file)
    MsgBox(0,"",$bla2)

    [/autoit]

    Grüsse!

  • Bequemer und sicherer wären hier aber vermutlich ini Dateien. Mal angenommen jemand editiert in den txt Dateien rum, dann stimmen möglicherweise deine Zeilen nicht mehr. Die Struktur einer ini ist da zuverlässiger, weil du jeder Zeile einen Namen gibst der dann mit iniread eideutig gefunden werden kann.

    Code
    [myGUIsettings]
    title=irgendwas
    button1Text=beenden
    input1Text=20000
    [autoit]


    GuiCtrlSetData($InputFeld, iniread($pfadzurinidatei, "myGUIsettings","input1Text","Schlüssel nicht gefunden...") )

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (28. Mai 2011 um 12:46)