vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Dialoge/Dateien   |   VB-Versionen: VB5, VB608.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 OtterBewertung:  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_ReadAllLiest des gesamten Inhalt einer Textdatei und gibt diesen als String zurück
txt_ReadLineLiest den Inhalt einer bestimmten Textzeile gibt diesen als String zurück
txt_AppendLineFügt einen Inhalt an das Ende einer Textdatei an
txt_WriteAllSpeichert einen Inhalt in eine Textdatei, wobei der bisherige Inhalt überschrieben wird
txt_WriteLineSpeichert den Inhalt einer bestimmten Textzeile - angegeben durch die Zeilennummer



Anzeige

Kauftipp Unser Dauerbrenner!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.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


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.