Rubrik: Dialoge/Dateien | VB-Versionen: VB5, VB6 | 08.08.01 |
Textdateien komfortabel verwalten Dieser Workshop stellt Ihnen ein Modul mit Funktionen und Prozeduren vor, mit deren Hilfe sich textbasierte (sequentielle) Dateien wirklich leicht und einfach verwalten lassen. Selbst das Einlesen und Speichern einer einzelnen frei bestimmberen Zeile erfolgt nun mit nur einem einzigen Befehl! | ||
Autor: Dieter Otter | Bewertung: | Views: 18.387 |
Dieser Workshop stellt Ihnen ein Modul mit Funktionen und Prozeduren vor, mit deren Hilfe sich textbasierte (sequentielle) Dateien wirklich leicht und einfach verwalten lassen. Selbst das Einlesen und Speichern einer einzelnen frei bestimmberen Zeile erfolgt nun mit nur einem einzigen Befehl!
Textdateien sind sehr beliebt, da sich hier schnell Informationen speichern und wieder abrufen lassen - so sollte man meinen. Dies trifft aber immer nur dann zu, wenn es um den gesamten Inhalt einer Textdatei geht - sprich, wenn man den gesamten Inhalt einliest, ein paar Änderungen vornimmt und dann den Inhalt einfach wieder komplett rausschreibt.
Was aber nun, wenn man nur bestimmte Zeileninformationen der Textdatei benötigt. Man möchte also z.B. den Inhalt der dritten Zeile auslesen und diesen dann modifziert wieder abspeichern.
Genau für solche Zwecke habe ich kurzerhand nachfolgende Routinen erstellt, die einem das Lesen und Schreiben bzgl. sequentieller Dateien wesentlich erleichtert.
Am einfachsten ist es, wenn Sie den gesamten nachfolgenden Code in ein neues Modul packen.
Zunächst ein paar Deklarationen zum Ermitteln des temporären Verzeichnisses und eines temporären Dateinamens. Diese Funktion wird für das Schreiben einzelner Zeilen-Inhalte benötigt.
Option Explicit ' Wird benötigt, zum Ermitteln des temporären ' Verzeichnisses und zum Erstellen temporärer Dateien Private Declare Function GetTempFileName Lib "kernel32" _ Alias "GetTempFileNameA" ( _ ByVal lpszPath As String, _ ByVal lpPrefixString As String, _ ByVal wUnique As Long, _ ByVal lpTempFileName As String) As Long Private Declare Function GetTempPath Lib "kernel32.dll" _ Alias "GetTempPathA" ( _ ByVal nBufferLength As Long, _ ByVal lpBuffer As String) As Long Private winTempPath As String ' Ermittelt einen temporären Dateinamen ' im temporären Verzeichnis Private Function txt_TempFilename() As String Dim myTempFileName As String Dim RetVal As Long If winTempPath = "" Then ' Temporäres Verzeichnis ermitteln winTempPath = Space$(256) RetVal = GetTempPath(Len(winTempPath), winTempPath) winTempPath = Left$(winTempPath, RetVal) End If ' Temporären Dateinamen ermitteln myTempFileName = Space$(256) Call GetTempFileName(winTempPath, "txt", 0&, myTempFileName) myTempFileName = Left$(myTempFileName, _ InStr(myTempFileName, Chr$(0)) - 1) txt_TempFilename = myTempFileName End Function
Inhalt einer Datei komplett in eine String-Variable einlesen
Das Einlesen des gesamten Inhaltes einer beliebigen Datei übernimmt die Funktion txt_ReadAll. Die Funktion erwartet als Paramater den vollständigen Dateinamen der Datei. Zurückgegeben wird dann der Inhalt der Datei - als String-Variable.
' Lesen des gesamten Inhaltes einer Textdatei ' sFilename: vollständiger Dateiname ' ========================================================= Public Function txt_ReadAll(ByVal sFilename As String) _ As String Dim F As Integer Dim sInhalt As String ' Existiert die Datei ? If Dir$(sFilename, vbNormal) <> "" Then ' Textdatei im Binärmodus öffnen und gesamten ' Inhalt in einem Rutsch auslesen F = FreeFile Open sFilename For Binary As #F sInhalt = Space$(LOF(F)) Get #F, , sInhalt Close #F End If txt_ReadAll = sInhalt End Function
Inhalt in Textdatei speichern
Die nachfolgende Routine speichert einen beliebigen Inhalt, angegeben durch den Paramater sLines in die Textdatei, welche durch den Paramater sFilename bestimmt wird. Sollte die Datei bereits existieren, wird diese überschrieben, d.h. der bisherige Inhalt der Datei geht vollständig verloren!
' Beliebigen Text in eine Textdatei speichern, wobei ' der bisherige Inhalt der Textdatei vollständig ' überschrieben wird ' ' sFilename: vollständiger Dateiname ' sLines : Inhalt, der gespeichert werden soll ' =============================================== Public Sub txt_WriteAll(ByVal sFilename As String, _ ByVal sLines As String) Dim F As Integer ' Datei zum Schreiben öffnen ' Achtung: bisheriger Inhalt wird gelöscht! F = FreeFile Open sFilename For Output As #F Print #F, sLines Close #F End Sub
Einzelne Zeile an eine Textdatei anfügen
Die nachfolgende Prozedur fügt den durch sLine angegebenen Inhalt ans Ende einer Textdatei an. Die Datei wird automatisch erstellt, sollte sie noch nicht existieren.
' Einzelne Zeile an eine Textdatei anhängen ' sFilename: vollständiger Name der Datei ' sLine : Inhalt, der gespeichert werden soll ' =============================================== Public Sub txt_AppendLine(ByVal sFilename As String, _ ByVal sLine As String) Dim F As Integer ' Datei zum "Anhängen" von Daten öffnen ' und Textzeile ans Ende anfügen F = FreeFile Open sFilename For Append As #F Print #F, sLine Close #F End Sub
Auslesen des Inhaltes einer ganz bestimmten Zeile
Um den Inhalt einer ganz bestimmten Zeile einzulesen, muss die Datei geöffnet werden und der Inhalt zeilenweise bis zur gewünschten Zeilenposition eingelesen werden. Zu beachten ist, daß es durchaus vorkommen kann, daß man z.B. den Inhalt der 5. Zeile ermitteln möchte, in der Datei selbst aber nur 3 Zeilen gespeichert sind. In diesem Fall muss dann ein Leerstring zurückgegeben werden.
' Lesen einer bestimmten Zeile einer Textdatei ' sFilename: vollständiger Dateiname ' LineToRead: Zeile, deren Inhalt zurückgegeben werden soll ' ========================================================= Public Function txt_ReadLine(ByVal sFilename As String, _ ByVal LineToRead As Long) As String Dim F As Integer Dim sLine As String Dim lRow As Long lRow = 0 ' Existiert die Datei ? If Dir$(sFilename) <> "" Then ' Datei zum Lesen öffnen F = FreeFile Open sFilename For Input As #F ' Solange einlesen, bis entweder Dateiende ' oder gewünschte Zeilennummer erreicht While Not EOF(F) And lRow < LineToRead lRow = lRow + 1 Line Input #F, sLine Wend Close #F End If ' Dateiende wurde frühzeitig erreicht, ' oder Datei war nicht vorhanden If lRow < LineToRead Then _ sLine = "" txt_ReadLine = sLine End Function
Ändern eines bestimmten Zeileninhaltes einer Datei
Hierbei handelt es sich um die umfangreichste der in diesem Modul vorgesehenen Prozeduren und Funktionen. Zum Ändern eines bestimmten Zeileninhaltes wird folgendermassen vorgegangen:
Es wird eine temporäre Datei erstellt, in welcher der Inhalt der Orginaltextdatei zwischengespeichert wird. Hierbei wird die Originaldatei zeilenweise ausgelesen. Stösst man nun beim Auslesen auf die zu ändernde Textzeile (angegeben durch einen Zeilennummer), so wird in diesem Fall nicht der ursprüngliche Inhalt, sondern der modifizierte Zeileninhalt in die temporäre Datei geschrieben. Alle restlichen Textzeilen werden dann wieder zeilenweise gelesen und gespeichert. Zum Abschluss muss dann die Originaldatei gelöscht werden und die temporäre Datei in die Originaldatei umbenannt werden.
' Einzelne Zeile in eine Textdatei speichern ' sFilename: vollständiger Name der Datei ' LinePos : Zeilenummer in der Textdatei ' sLine : Inhalt, der gespeichert werden soll ' =============================================== Public Sub txt_WriteLine(ByVal sFilename As String, _ ByVal LinePos As Long, ByVal sLine As String) Dim F As Integer Dim N As Integer Dim I As Long Dim lRow As Long Dim Zeile As String Dim myTempFile As String If Dir$(sFilename, vbNormal) = "" Then ' Wenn Datei nicht existiert, automatisch erstellen ' und Inhalt sofort speichern F = FreeFile Open sFilename For Output As #F ' Datei mit Leerzeilen füllen, bis gewünschte ' Schreibposition erreicht ist For I = 1 To LinePos - 1 Print #F, "" Next I ' Inhalt speichern Print #F, sLine Close #F Else ' Temporäre Datei erstellen myTempFile = txt_TempFilename() ' Original-Datei zum Lesen und temporäre ' Datei zum Schreiben öffnen F = FreeFile: Open sFilename For Input As #F N = FreeFile: Open myTempFile For Output As #N ' Original-Datei einlesen und x. Zeile durch ' neuen Inhalt ersetzen lRow = 0 While Not EOF(F) lRow = lRow + 1 Line Input #F, Zeile If lRow = LinePos Then ' x. Zeile durch neuen Inhalt ersetzen Zeile = sLine End If Print #N, Zeile Wend ' sollte LinePos größer sein, als die bisherige ' Anzahl gespeicherter Zeilen in der Orginaldatei ' wurde der neue Inhalt noch nicht gespeichert ' und die Datei muss ggf. noch mit zusätzlichen ' Leerzeilen gefüllt werden! If lRow < LinePos Then ' Ggf. mit Leerzeilen füllen For I = lRow + 1 To LinePos - 1 Print #N, "" Next I ' Neuen Zeilen-Inhalt speichern Print #N, sLine End If ' Dateien schliessen Close #F: Close #N ' Alte Datei löschen Kill sFilename ' temporäre Datei in "alte" Datei umbenennen FileCopy myTempFile, sFilename Kill myTempFile End If End Sub
Ein paar Beispiele
Im nachfolgend ein paar Beispiele, um Ihnen die Funktionen ein wenig näher zu bringen.
Datei myFile.txt erstellen und Inhalt einer MultiLine-Textbox speichern
txt_WriteAll "myFile.txt", Text1.Text
3. Zeile der Datei myFile.txt auslesen und in einer MsgBox anzeigen
MsgBox txt_ReadLine("myFile.txt", 3)
3. Zeile der Datei durch den Text "Hallo, ich bin's" ersetzen
MsgBox txt_WriteLine("myFile.txt", 3, "Hallo ich bin's")
Und hier nochmals alle Funktionen im Überblick
txt_ReadAll | Liest des gesamten Inhalt einer Textdatei und gibt diesen als String zurück |
txt_ReadLine | Liest den Inhalt einer bestimmten Textzeile gibt diesen als String zurück |
txt_AppendLine | Fügt einen Inhalt an das Ende einer Textdatei an |
txt_WriteAll | Speichert einen Inhalt in eine Textdatei, wobei der bisherige Inhalt überschrieben wird |
txt_WriteLine | Speichert den Inhalt einer bestimmten Textzeile - angegeben durch die Zeilennummer |