BearbeitenLesen 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.
| Geht | Geht nicht |
|---|
| .txt | .gif - Ausnahmen bestätigen die Regel ;-) |
| .csv | .jpg |
| HTML Dateien | .png |
| XML in allen möglichen Varianten | Word-oder Exceldatei |
| Vistenkartendatei .VCF | Exe-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
BearbeitenSchreiben 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.
BearbeitenAnhä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
BearbeitenAnwendungsbeispiel - 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