FSO steht für "File System Objects" und ist eine Objektklasse durch die man relativ einfach mit Dateien, Laufwerken und Ordnern arbeiten kann. Egal ob verschieben, kopieren, lesen, schreiben oder suchen.
Vor- und Nachteile gegenüber Input, Line Input etc.
Vorteile: 1. Kann mit verschiedensten Zeilenumbrucharten umgehen und nicht nur mit vbCrLf/vbNewline (Chr(13) + Chr(10). Auf andere Zeilenumbrüche stößt man oft bei wordlists oder sql files.
2. Relativ einfache Handhabung. Kein rumärgern mit Datensatznummern.
Nachteile: 1. Es muß die "scrrun.dll" mitgeliefert werden bzw. schon auf dem System vorhanden sein. 2. Ist etwas langsamer beim einlesen von Dateien.
In diesem tutorial möchte ich euch erklären wie man mit FSO Dateioperationen durchführt.
2. Deklarationen
Als erstes brauchen wir einen Verweis auf "Microsoft Scripting Runtime". Zu finden unter "Projekt -> Verweis".
Und dann deklarieren wir das Objekt. Wenn ihr von verschiedenen Formen darauf zugreifen wollt, dann natürlich public.
Code:
Private FSO As New FileSystemObject
Und jetzt da wir Dateien auslesen bzw. schreiben wollen brauchen wir noch einen TextStream.
Code:
Private tStream as TextStream
Für kopieren, verschieben, löschen usw. wird dies nicht benötigt.
3. Lesezugriff
Wie sieht also die Syntax zum öffnen einer Datei aus?
Code:
Set tStream = FSO.OpenTextFile(Filename, IOMode, Create)
(tStream) Unsere TextStream Variable.
(.OpenTextFile) Wir wollen eine Textdatei öffnen.
(Filename) Hier gibt man den Pfad zur Datei an.
(IOMode) Möglichkeiten:
1. ForAppending 2. ForReading 3. ForWriting
Wir brauchen also ForReading.
(Create) Hier kann man bestimmen ob eine nicht existierende Datei erstellt werden soll oder nicht. Verlangt True oder False.
3.1 Zeilen
Beispiel: Anzahl Zeilen einer Textdatei ermitteln.
Code:
Dim zCount As Long 'Variable für Zeilenanzahl<br /><br />'Datei öffnen<br />Set tStream = FSO.OpenTextFile("C:test.txt", ForReading, False)<br /><br />zCount = 0<br />'Schleife zum zählen<br />Do Until tStream.AtEndOfStream<br /> tStream.SkipLine<br /> zCount = zCount + 1<br /> DoEvents<br />Loop<br />tStream.Close
(tStream.AtEndOfStream) Die Schleife läuft so lange, bis das Ende des Streams, der Datei erreicht ist.
Hier gibt es noch die Option "AtEndOfLine". Da würde die Schleife klarerweise nur bis zum Ende der Zeile laufen, in der sich der Zeiger gerade befindet.
(tStream.SkipLine) Die Zeile wird übersprungen. Da wir nur Zeilen zählen wollen, brauchen wir nicht jede Zeile extra einlesen.
(zCount = zCount + 1) Zeilenanzahl wird um 1 erhöht.
(DoEvents) DoEvents benötigt man, da sonst diese Schleife das Programm so auslasten würde, dass es einfriert. Besser wäre es aber DoEvents durch die gepostete Version "NewDoEvents" bei den sources, zu ersetzen. Dann wird DoEvents nicht bei jedem einzelnen Aufruf ausgeführt und man erhöht dadurch die Leistung.
(tStream.Close) Der Stream wird wieder geschloßen.
Der code lässt sich gut in eine Funktion auslagern. Somit kann man überall schnell und einfach die Zeilenanzahl ermitteln lassen. Praktisch wenn man den Fortschritt in einer Progressbar anzeigen will.
Zeilen einlesen
Code:
Do Until tStream.AtEndOfStream<br /> Text1.SelText = tStream.ReadLine & vbCrLf<br /> DoEvents<br />loop<br />tStream.close
(tStream.ReadLine) Hiermit liest man also eine Zeile ein.
3.2 Bytes
Datei einfach wieder ganz normal im Lesezugriff öffnen.
Bestimmte Anzahl an bytes überspringen. Beispiel mit 100 Bytes.
Code:
tStream.Skip (100)
Bestimmte Anzahl an bytes einlesen. Beispiel mit 100 Bytes.
Code:
Text1.Text = tStream.Read(100)
Komplette Datei auf einmal einlesen
Code:
Text1.Text = tStream.ReadAll
4. Schreibvorgang
Datei für den Schreibmodus öffnen.
Code:
set tstream = fso.OpenTextFile(Filename, ForWriting, True)
So wird also die Textdatei im Schreibmodus geöffnet und falls sie nicht existiert soll er sie gleich erstellen.
Genauso könnte man hier Append nutzen.
4.1 Zeilen
Eine Zeile in die Datei schreiben:
Code:
tStream.WriteLine("Text")
Ist also eigentlich sehr simpel.
Außerdem gibt es noch die Möglichkeit eine bestimmte Anzahl an leeren Zeilen auf einmal zu schreiben.
Code:
tStream.WriteBlankLines(10)
In diesem Fall also 10 Zeilen.
4.2 Bytes
Text schreiben.
Code:
tStream.Write("Text")
Manche werden sich jetzt fragen was der Unterschied zwischen Writeline und Write ist. Eigentlich nur ein kleiner. Writeline macht automatisch einen Zeilenumbruch nach dem Text. Und Write eben nicht. Kommt also auf die Situation an, was man braucht.
5. Kopieren
Die meisten von euch kennen wahrscheinlich die Funktion "FileCopy" von VB6 und das selbe gibt es auch bei dem FSO. Nur das man hier noch angeben kann ob eine vorhandene Datei überschrieben werden soll oder nicht.
Natürlich könnt ihr das auch ohne Klammern und Call schreiben.
(.CopyFile) Wir nutzen die Funktion CopyFile.
(Source) Benötigt den Pfad zur Datei, die kopiert werden soll.
(Destination) Benötigt den Pfad wohin die Datei kopiert werden soll.
(OverWriteFiles) Hier könnt ihr also gleich bestimmen ob eine schon existierende Datei einfach überschrieben wird, oder nicht. Verlangt natürlich einen Boolean Wert. True oder False.
6. Verschieben
Syntax:
Code:
Call FSO.MoveFile(Source, Destination)
Wir benutzen also ".MoveFile". Source und Destination sollte jetzt klar sein. Aus welchem Grund auch immer kann man mit der Funktion leider die Dateien nicht auf ein anderes Laufwerk verschieben. Eine andere Partition die sich auf der selben HDD geht, aber ein anderes Laufwerk nicht. Da muß man dann einfach die Datei kopieren und danach löschen.
7. Umbenennen
Syntax:
Code:
Call FSO.MoveFile(Source, Destination)
Wieder .MoveFile. Man gibt einfach den selben Pfad, aber einen anderen Dateinamen an.
8. Löschen
Syntax:
Code:
Call FSO.DeleteFile(FileSpec, Force)
(.DeleteFile) Funktion zum löschen einer Datei
(FileSpec) Hier gibt man den Pfad zur Datei als string an.
(Force) Und hier noch etwas nettes. Hier kann man bestimmen ob eine schreibgeschützte Datei auch gelöscht werden soll oder nicht. Erwartet also True oder False.
9. Abschluss
Und das wars wieder mal. Ich werde noch versuchen weiter Themen über das FSO zu behandeln wie das arbeiten mit Ordnern bzw. das suchen/ermitteln von Ordnern und Dateien auf Laufwerken.
Hoffe es war nicht zuviel auf einmal und ihr hattet Spaß dran.^^
mfg, ZiG
Ps.: Falls Fehler entdeckt werden, dienen diese zur allgemeinen Belustigung und als C&P Protection. _________________