Gambas: Dateien
Zurück zu Gambas
Datei speichern
[Bearbeiten]Im folgenden Beispielprogramm wird der Text einer Textarea in einer Datei auf der Festplatte gespeichert. Das Ganze erfolgt über den Standarddialog. Sie brauchen eine Textarea und einen Commandbutton um das Programm in Gang zu bringen.
Beispiel:
PUBLIC SUB Form_Open() Textarea1.Text = "Dies ist ein Test" END PUBLIC SUB Button1_Click() Dialog.SaveFile() File.Save(Dialog.Path, TextArea1.Text) CATCH IF ERROR THEN RETURN END
Datei speichern ohne Dialog
[Bearbeiten]Sie können eine Datei auch ohne Standarddialog speichern. Dann müssen Sie allerdings den Pfad und den Dateinamen im Programm angeben. Wie das geht, zeigt folgendes Beispiel. Sie brauchen eine Textarea und einen Commandbutton um es in Gang zu bringen.
Programm:
PUBLIC SUB Form_Open() Textarea1.Text = "Dies ist ein Test" END PUBLIC SUB Button1_Click() File.Save(system.Home & "/test.txt",TextArea1.Text) File.Save(User.Home & "/test.txt",TextAreal1.Text) ' Gambas 3.8.4 CATCH IF ERROR THEN RETURN END
Mit dem Befehl system.home wird das aktuelle Benutzerverzeichnis gewählt zb /home/ihrname.
Überprüfen Sie - am besten mit dem Konqueror oder mit der Konsole- , ob die Datei auch wirklich gespeichert wurde. Probieren Sie aus, was passiert wenn Sie die Fehlerroutine mit Catch weglassen. ( Das macht solange nichts, solange die Pfadangabe korrekt ist. Ist die Pfadangabe falsch, dann gibt es eine Fehlermeldung: File or directory does not exist.) Probieren Sie aus, was passiert wenn die Datei, in die gespeichert werden soll, schon existiert. ( Die existierende Datei wird ohne Rücksicht auf Verluste überschrieben.) Probieren Sie aus, was passiert, wenn die Pfadangabe falsch ist. ( Es kommt zu keiner Fehlermeldung, solange die Fehlerroutine mit Catch eingebaut ist !!)
Programmvariante: Nur ein Commandbutton ist nötig.
PUBLIC SUB Button1_Click() File.Save(system.Home & "/test.txt","Dies ist ihr Text") File.Save(User.Home & "/test.txt","Dies ist ihr Text") ' Gambas 3.8.4 CATCH IF ERROR THEN RETURN END
Datei laden 1
[Bearbeiten]Auf den meisten Linuxsystemen findet sich die Datei passwd. Diese wollen wir in eine Textarea laden
Dazu muß man wissen, wo die Datei steht: Sie steht im Verzeichnis: /etc
Für das Programm brauchen Sie:
- eine Form
- eine Textarea
Code:
PUBLIC SUB Form_Open() s AS String s = File.Load("/etc/passwd") 'Die Datei muss existieren, 'sonst kann sie nicht geladen werden. textarea1.Text = s END
Wie Sie sehen stehen in der Datei die Passwörter aller angemeldeten Benutzer Ihres Linuxsystems. Diese Datei ist lesbar aber schreibgeschützt.
Datei laden 2
[Bearbeiten]Wenn Sie im Abschnitt Datei speichern die Datei test.txt in ihrem Homeverzeichnis gespeichert haben, können Sie sich diese wieder problemlos laden:
PUBLIC SUB Button1_Click() DIM sLine AS String sLine = File.Load(system.home & "/test.txt") sLine = File.Load(User.Home & "/test.txt") ' Gambas 3.8.4 PRINT sLine END
Weiteres Beispiel:
Sie haben eine Datei Datei.text in Ihrem Verzeichnis und wollen diese Datei in Gambas laden:
Wie das geht zeigt das folgende Beispiel:
PUBLIC SUB Button1_Click() DIM sLine AS String sLine = File.Load("Datei.text") 'Die Datei muss existieren, 'sonst kann sie nicht geladen werden. PRINT sLine END
Sie brauchen eine Form mit einem Commandbutton. Die Ausgabe erfolgt im Direktfenster. Um das Programm in Gang zubringen, müssen Sie erst mit einem Editor die Datei Datei.text erstellen. Dann speichern Sie die Datei in ihrem Gambas Projektverzeichnis ab. Bei mir steht die Datei zb in dem Verzeichnis :
file:/home/rhoff/gambas-1.0/laden2/
Datei laden mit Standarddialog
[Bearbeiten]Mit dem Standarddialog kann man Pfad und Dateiname beim Laden wählen.
Für das Beispiel brauchen Sie eine Form , einen Commandbutton, ein Labelfeld und eine Textarea.
PUBLIC SUB Button1_Click() IF Dialog.OpenFile() THEN RETURN Label1.Text = Dialog.Path TextArea1.Text = File.Load(Dialog.Path) END
Datei laden und speichern mit Addyplus
[Bearbeiten]In einem kleinen Anwendungsprogramm soll gezeigt werden wie man eine Zahlenkolonne laden und speichern kann. Dazu wird das kleine Summierprogramm Addy erweitert und zu Addyplus umfunktioniert.
Siehe auch http://de.wikibooks.org/wiki/Gambas:_Rechnen#Addy_der_Summierer
So schaut die Form jetzt aus:
Sie brauchen also
- eine Textarea
- eine Textbox
- und 5 Befehlsknöpfe auf Ihrer Form, um das Programm zu starten.
So schaut der Code aus:
PUBLIC SUB Form_Open() ME.Text = "Addy, der Summierer" Textarea1.Text = "" Textbox1.Text = "" END PUBLIC SUB Button1_Click() DIM text AS String DIM summe AS Float DIM liste AS String[] DIM posten AS String text = textarea1.Text liste = Split(text,Chr(10)) FOR EACH posten IN liste summe = summe + Val(posten) NEXT textbox1.Text = summe CATCH Message.Info("Bitte in der letzten Zeile kein Return eingeben ! Drücken Sie die Rücktaste!") END PUBLIC SUB Button3_Click() Dialog.SaveFile() File.Save(Dialog.Path, TextArea1.Text) CATCH IF ERROR THEN RETURN END PUBLIC SUB Button2_Click() IF Dialog.OpenFile() THEN RETURN TextArea1.Text = File.Load(Dialog.Path) END PUBLIC SUB Button4_Click() SELECT Message.Question("Vorsicht! Das Textfeld wird gelöscht.","Abbrechen","Löschen") CASE 1 RETURN CASE 2 Textarea1.Text ="" END SELECT END PUBLIC SUB Button5_Click() ME.CLose END
Geben Sie in die Textarea irgendeine Zahlenreihe ein, beispielsweise
1 2 3
Dann drücken Sie auf Speichern. Geben Sie einen Dateiname ein zb s1 und speichern sie die erste Zahlenreihe ab.
Dir Befehl
[Bearbeiten]File name array = Dir ( Directory [ , File pattern ] )
Dieser Befehl gibt einen String Array zurück, der die Namen der Dateien des Verzeichnisses enthält, welches mit File pattern übereinstimmt. Falls kein File pattern spezifiziert wurde , dann werden alle Dateien ins Array geladen. File pattern kann dieselben allgemeinen Zeichen enthalten wie der LIKE Befehl.
Beispiel:
PUBLIC SUB Form_Open() DIM File AS String FOR EACH File IN Dir(system.home, "*") FOR EACH File IN Dir(User.Home,"*") ' Gambas 3.8.4 PRINT File NEXT END
In diesem Beispiel werden alle Dateien im Home Verzeichnis des aktuellen Benutzers im Direktfenster ausgegeben. Dabei werden allerdings auch die Unterverzeichnisse als Dateien gehandhabt.
Beispiel
' Print a directory SUB PrintDirectory(Directory AS String) File AS String FOR EACH File IN Dir(Directory, "*.*") PRINT File NEXT END
Beispielvariante : Sie brauchen eine Form mit einem Button auf der Form. Fügen Sie in das Programm statt /home/rho/gambastext/ ein existierendes Verzeichnis auf Ihrem PC ein.
' Gambas class file PUBLIC SUB Button1_Click() PrintDirectory ("/home/rho/gambastext/") END SUB PrintDirectory(Directory AS String) DIM File AS String FOR EACH File IN Dir(Directory, "*.*") PRINT File NEXT END
Neues Verzeichnis anlegen
[Bearbeiten]Mit dem Befehl MakeDir kann man ein neues Verzeichnis anlegen. Vorsicht: Es klappt nur,
- wenn Sie einen korrekten Pfad eingegeben haben,
- wenn Sie die Schreibberechtigung für diesen Pfad haben
- wenn Sie nicht in das Verzeichnis des offenen Gambasprojektes ein neues Verzeichnis schreiben wollen. ( siehe Application.Name)
- keine Datei gleichen Namens in diesem Pfad existiert.
Beispiel:
Sie brauchen einen Befehlsbutton, um das Programm in Gang zu bringen:
PUBLIC SUB Button1_Click() MKDIR system.home & "/test" MKDIR User.Home & "/test" ' Gambas 3.8.4 END
system.home gibt dabei das aktuelle Nutzerverzeichnis /home/zbihrname an.
Schauen Sie mit dem Konqueror nach, ob das Verzeichnis wirklich angelegt wurde.
Am besten fügt man eine Fehlerroutine ein, für den Fall das der Pfad schon existiert oder kein Schreibzugriff besteht.
Datei kopieren
[Bearbeiten]Der COPY Befehl kopiert eine Datei von einem Verzeichnis in ein anderes.
COPY Quellverzeichnis/Datei TO Zielverzeichnis/Datei
Obiger Befehl kopiert eine Datei aus dem Quellverzeichnis in das Zielverzeichnis. Dabei braucht die Datei nicht unbedingt denselben Namen zu haben, wie die Zieldatei. Unterverzeichnisse werden dabei allerdings nicht kopiert. (Note that you cannot copy directories recursively with this function. )
Beispiel:
' Sichert die versteckte Gambaskonfigurationsdatei ' Das Verzeichnis muß vorhanden sein ' und man muß den Zugriff darauf haben COPY system.name & "/.gambas/gambas.conf" TO system.name & "/gambas.conf.save"
System.name entspricht dabei ihrem Homeverzeichnis.
Das Beispiel ergibt eine Fehlermeldung, wenn :
- Das Verzeichnis nicht vorhanden ist
- Kein Schreibzugriff auf das Verzeichnis existiert
- Die Zieldatei schon vorhanden ist.
Beispiel2:
Sie brauchen einen Befehlsbutton auf Ihrer Form, um das Beispiel zu starten.
PUBLIC SUB Button1_Click() COPY "/home/ihrname/.gambas/gambas.conf" TO "/home/ihrname/test/gambas.conf.save" END
Wenn man mehrere Dateien auf einmal kopieren will, hilft einem der Dir Befehl. Siehe http://de.wikibooks.org/wiki/Gambas:_Datei
Wie Verzeichnisse kopiert oder verschoben werden können ist hier [[1]] beschrieben
Wie kann man das Home Verzeichnis des aktuellen Benutzers abfragen ?
[Bearbeiten]Der Befehl Application.home funktioniert dazu nicht mehr. Der Befehl Application.Name ergibt den Pfad des Programmes , welches gerade läuft, aber nicht das Homeverzeichnis.
Das Homeverzeichnis des aktuellen Benutzers erhält man mit dem Befehl system.home in Gambas 2 funktioniert auch dieser Befehl nicht mehr. Hiefür muss nun die 'User' Klasse hergenommen werden. Also lautet der Befehl: user.home
Beispiel1
PUBLIC SUB Form_Open() PRINT system.Home END
Beispiel2:
PUBLIC SUB Form_Open() ME.Text = "Systeminfo" textarea1.text = "Charset = " & system.Charset & Chr(13) & Chr(10) textarea1.text = textarea1.text & "Domain = " & system.Domain & Chr(13) & Chr(10) textarea1.text = textarea1.text & "Homeverzeichnis = " & system.Home & Chr(13) & Chr(10) textarea1.text = textarea1.text & "Host = " & system.Host & Chr(13) & Chr(10) textarea1.text = textarea1.text & "Sprache = " & system.Language & Chr(13) & Chr(10) textarea1.text = textarea1.text & "Pfad = " & system.path & Chr(13) & Chr(10) textarea1.text = textarea1.text & "Benutzer = " & system.User ' PRINT system.Charset ' PRINT system.Domain ' PRINT system.Home ' PRINT system.Host ' PRINT system.Language ' PRINT system.Path ' PRINT system.User END PUBLIC SUB Button1_Click() ME.Close END
Man braucht eine Textarea und einen Befehlsbutton, um das Programm zu starten.
Beispiel3
PUBLIC SUB Form_Open() PRINT user.Home END
Existiert eine Datei ?
[Bearbeiten]Im folgenden Beispiel wird überprüft, ob die Bash vorhanden ist oder nicht.
Beispiel:
PUBLIC SUB Button1_Click() IF Exist("/bin/bash") = TRUE THEN Label1.Text="Bash ist vorhanden" END IF IF Exist("/bin/bash") = FALSE THEN Label1.Text="Fehler: Bash ist nicht vorhanden" END IF END
Sie brauchen einen Befehlsbutton und ein Labelfeld, um das Programm in Gang zu bringen.
Ähnlich funktioniert:
GB.ExistFile(file_name)
Datei laden und speichern in einem kleinen kombinierten Programm
[Bearbeiten]Im folgenden Programm wird eine Datei test.txt geladen und gespeichert.
So schaut das fertige Programm aus:
Sie brauchen also:
- Eine Form
- Eine Textbox
- 5 Befehlsbuttons
Der Code schaut so aus:
PUBLIC SUB Form_Open() Textbox1.Text = "Dies ist ein Test" END PUBLIC SUB Button1_Click() 'Gespeichert wird im Dialog d.h es sind auch andere Dateinamen möglich Dialog.SaveFile() File.Save(Dialog.Path, TextBox1.Text) 'File.Save("test.txt",TextBox1.Text) 'test.txt muss schon vorhanden sein 'sonst gibt es eine Fehlermeldung. END PUBLIC SUB Button2_Click() 'Geladen wird ohne Dialog IF Exist("test.txt") THEN Textbox1.Text = File.Load("test.txt") 'test.txt muss vorhanden sein! END PUBLIC SUB Button3_Click() 'Textbox wird gelöscht Textbox1.Text ="" END PUBLIC SUB Button4_Click() 'Programmende ME.Close END PUBLIC SUB Button5_Click() 'Zufallstext erzeugen DIM Z AS Integer DIM Buchstabe AS String Randomize() Textbox1.Text = "" FOR Z = 1 TO 10 Buchstabe = Chr$(Int(Rnd(65,91))) TextBox1.Text = TextBox1.Text & Buchstabe NEXT END
Datei schreiben mit WRITE
[Bearbeiten]Man schreibt in einer Datei wie auch in Basic Sprache üblich ist:
Dim hFile As File hFile = Open application.path & "/blabla.txt " For Write Append
Write #hFile, "Hallo Welt"
Close #hFile
Wird "For Write" mit "Append" angegeben muss eine Datei "blabla.txt vorhanden sein. Wird "For Write" ohne "Append" angegeben wird eine neue Datei "blabla.txt erzeugt.
Daten einlesen mit READ
[Bearbeiten]Der READ befehl liest Daten aus den verschiedensten Quellen in den Computer ein. Am einfachsten läßt er sich erklären, wenn man eine Datei von der Festplatte in die Anzeige lädt. Wie das geht zeigt folgendes Programm.
Sie brauchen dazu:
- eine Form
- einen Befehlsbutton
Der Code dazu lautet folgendermaßen:
PUBLIC SUB Form_Open() Button1.Text = "Read test.txt" 'Der Befehlsbutton1 wird umbenannt File.Save(application.path & "/test.txt","Dies ist ein Test") 'Es wird eine Testdatei im aktuellen Verzeichnis angelegt und gespeichert CATCH 'Mögliche Fehler abfangen IF ERROR THEN RETURN END PUBLIC SUB Button1_Click() 'Die Testdatei wird bitweise eingelesen und wieder zusammengeklebt hFile AS File s AS String OPEN "test.txt" FOR READ AS #hFile WHILE NOT Eof(hFile) LINE INPUT #hFile, s PRINT s 'Ausgabe im Direktfenster WEND FINALLY ' Immer ausführen, auch bei einem Fehler CLOSE #hFile CATCH ' Nur bei einem Fehler ausführen PRINT "Die Datei test.txt kann nicht ausgegeben werden.." END