AspGerman Wiki

Bearbeiten

Lesen von Textdateien

Ist relativ einfach wie die folgenden Beispiele zeigen. Wobei der Begriff Textdatei ziemlich weit gefasst ist. Letztlich kann das Filesystem Object oder kurz FSO jede Datei lesen die keine Binärdaten enthält.

GehtGeht nicht
.txt.gif - Ausnahmen bestätigen die Regel ;-)
.csv.jpg
HTML Dateien.png
XML in allen möglichen VariantenWord-oder Exceldatei
Vistenkartendatei .VCFExe-Dateien

Als simple Regel: kann ich die Datei mit Notepad anschauen und die Zeichen sind gut lesebar (muss nicht heissen dass sie Sinn machen), dann sollte ich sie mit FSO lesen und schreiben können. Verschieben oder Umbenennen lassen sich alle Dateien.

' --------------------
'   Datei lesen
' --------------------
Dim fso, datei, aVar

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set datei = fso.OpenTextFile("test.txt")

Do Until datei.AtEndOfStream
	Response.Write datei.ReadLine
	' -- oder in eine Variable schreiben
	' aVar = datei.ReadLine
	' -- alles in eine Variable schreiben, hier mit Zeilenumbruch
	' aVar = aVar & datei.ReadLine & vbcrlf
Loop
Datei.Close
' Response.Write aVar    ' -- die andere Variante: die zuvor eingelesene Variable ausgeben

Dieses Beispiel wird so noch nicht funktionieren, es sei denn die Datei test.txt wäre im Windows-Verzeichnis vorhanden. Ich will wahrscheinlich eine Datei im aktuellen Web anzeigen. Hier hilft das Server-Objekt mit der Methode ServerMappath weiter, die den Pfad im Web liefert. Wobei Webpfade eben webüblich mit Vorwärtsschrägstrich geschrieben werden. Im Gegensatz zum Backslash bei Angaben im Dateisystem. Einige Beispiele:

Set datei = fso.OpenTextFile(Server.Mappath("./test.txt"))  
	' aktuelles Verzeichnis
Set datei = fso.OpenTextFile(Server.Mappath("unter/test.txt"))  
	' ein Verzeichnis tiefer in unter
Set datei = fso.OpenTextFile(Server.Mappath("/test.txt"))  
	' im Web-Root kann sein dass dies wegen Sicherheitseinstellungen unterdrückt ist
Set datei = fso.OpenTextFile(Server.Mappath("/woanders/test.txt"))  
	' Sicherheit wie oben
' -- Unterschied klar ?
Set datei = fso.OpenTextFile("C:\boot.ini"))  
	' wenn das gehen sollte hat der Admin gepennt

Neben der zeilenweisen Leserei lässt sich eine Datei auch auf einmal etwa in eine Variable einlesen.

Set fso = CreateObject("Scripting.FileSystemObject")
Set datei = fso.OpenTextFile(Server.Mappath("./test.txt"))
a = datei.ReadAll
datei.close
Response.Write a

Oder Zeichen für Zeichen

Set fso = CreateObject("Scripting.FileSystemObject")
Set datei = fso.OpenTextFile(Server.Mappath("./test.txt"))
Do Until datei.AtEndOfStream
  a = datei.Read(20)
Loop
datei.close
Response.Write "Die ersten 20 Zeichen sind " & a

Bearbeiten

Schreiben von Textdateien

Ist nicht komplizierter als das Lesen, wenn da nicht das Thema Sicherheit zuschlagen würde. Üblicherweise kann ich in ein reguläres Webverzeichnis nicht schreiben. Möglichkeiten trotzdem zu schreiben sind

  • das meist vorhandene virtuelle Verzeichnis /scripts verwenden.
  • bei einem Frontpage-web das Unterverzeichis _private verwenden
  • selbst ein virtuelles Verzeichnis zum Schreiben anlegen. In der IIS Managementkonsole ist das gleich erledigt. Klar dass Schreibrechte zugewiesen werden müssen. Wirklich wichtig aber das Lesen auszuschalten, so dass Besucher von aussen nicht einfach die dort gespeicherten Daten und Dateien abrufen können.

' --------------------
'   Dieses Programm erstellt eine Datei und schreibt etwas hinein
' --------------------
Dim fso, datei
Set fso = CreateObject("Scripting.FileSystemObject")
Set datei = fso.CreateTextFile(Server.Mappath("_private/test.txt"))
datei.writeline "Hallo Welt"
datei.close
Neben der Methode writeline gibt es die Methoden write und writeblanklines

datei.write "Hallo "
datei.write "Welt" & vbcrlf  ' wäre dann analog zum obigen Beispiel
datei.writeblanklines 5
datei.write "aus is"
Wer sich an den unterschiedlichen Methoden CreateTextFile und OpenTextFile stört kann auch durchgängig OpenTextFile verwenden, wie man im folgenden Beispiel abzuleiten kann.

Bearbeiten

Anhängen an Textdateien

' --------------------
'   Dieses Programm hängt an eine Datei an
' --------------------
Dim fso, datei
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Set fso = CreateObject("Scripting.FileSystemObject")
Set datei = fso.OpenTextFile(Server.Mappath("/scripts/test.txt"), ForAppending)
datei.Write "Hallo Welt!"
datei.Close

Falls die angegebene Datei noch nicht existiert wird ein Laufzeitfehler erzeugt. Sollte die Datei gegebenfalls angelegt werden bietet dies das dritte Argument.

Dim fso, datei
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const CCreate = True
Set fso = CreateObject("Scripting.FileSystemObject")
Set datei = fso.OpenTextFile("Server.Mappath("/scripts/test.txt"), ForAppending, CCreate)
datei.Write "Hallo Welt!"
datei.Close

Bearbeiten

Anwendungsbeispiel - Formulardaten in eine Datei speichern

Dieses Beispielscript schreibt die von einem Formular übergebenen Daten in eine Logdatei. Kann zum Beispiel zur Fehleranalyse verwendet werden oder als Backup, falls ein Script eigentlich Mail verschickt und der Mailserver hängen sollte.

Dim fso, datei
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const CCreate = True
Set fso = CreateObject("Scripting.FileSystemObject")
Set datei = fso.OpenTextFile("Server.Mappath("/mylogs/log.tab"), ForAppending, CCreate)
datei.Write now() & vbtab
For Each Field In Request.Form
	If Request.Form(Field).Count > 1 Then
		' ein Name mehrmals verwendet, oder bei Grafiken für Schaltfläche tauchen x und y auf.
		For i = 1 to Request.Form(Field).Count
			datei.Write Field & vbtab & Request.Form(Field)(i) & vbtab
		Next
	Else
		datei.Write Field & vbtab & Request.Form(Field) & vbtab
	End If
Next
datei.Write vbcrlf  ' die Logzeile abschliessen.
datei.Close

ScrewTurn Wiki version 2.0.33. Some of the icons created by FamFamFam.