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 ' 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 ' 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 ' 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 ' 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 ' 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 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
Dieser Workshop wurde bereits 18.328 mal aufgerufen.
Anzeige
Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats September 2024 Dieter Otter Übergabeparameter: String oder Array? Mit der IsArray-Funktion lässt sich prüfen, ob es sich bei einem Übergabeparameter an eine Prozedur um ein Array oder einer "einfachen" Variable handelt. Neu! sevDTA 3.0 Pro SEPA mit Kontonummernprüfung Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. |
|||||||||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |