|
Möchten Sie in einer Datei zusätzliche Informationen ablegen können, ohne den eigentlichen Inhalt der Datei anzutasten? Seit Windows 2000 bzw. seit dem mit dieser Windows-Version eingeführten Dateisystem NTFS 5 besteht diese Möglichkeit, die Sie im wesentlichen auch ohne Probleme von Visual Basic aus nutzen können. Die Rede ist von so genannten "Streams".
Vor dem Dateisystem NTFS 5 war der Begriff "Streams" aus der Sicht des Dateisystems irrelevant. Es gab nur einen einzigen "Stream" je Datei - den Haupt-Stream, in dem alle Daten landen, die auf gewohnte Weise in eine Datei geschrieben werden. Seit NTFS 5 können Sie jedoch zusätzliche Datenbereiche einer Datei adressieren, eben zusätzliche Streams, in denen Sie unabhängig vom gewohnten Haupt-Stream Daten ablegen und aus denen Sie sie wieder einlesen können. Einen solchen Stream sprechen Sie über den Dateinamen an, der um einen eigenen Namen ergänzt wird, abgetrennt durch einen Doppelpunkt - beispielsweise:
test.txt:ExtraDaten
Für die Datei-FunktionOpen zum Öffnen einer Datei in Visual Basic ist diese Schreibweise völlig transparent. Das bedeutet, dass Sie statt eines reinen Dateinamens wie bisher auch einen solchen um eine Stream-Angabe erweiterten Dateinamen übergeben können. Statt des Haupt-Streams der Datei wird dann entsprechend der benannte Stream angelegt, geöffnet, beschrieben und gelesen. Existiert die Datei selbst noch nicht, wird sie gegebenenfalls zugleich angelegt. Beim Verschieben oder Kopieren der Datei wandern die Inhalte der zusätzlichen Streams mit - sie sind fest mit dem Dateinamen verbunden.
Probieren Sie es einfach einmal aus und schreiben Sie beliebige Daten in eine Datei - zum Beispiel:
Dim nFNr As Integer
Dim nText As String
nText = "Hallo " & Now
Open "c:\test.txt:ExtraDaten" For Binary As #nFNr
Put #nFNr, , nText
Close #nFNr
Bis auf den Zusatz zum Dateinamen sieht das absolut wie gewohnt aus, nicht wahr? Auch das Auslesen der Daten erfolgt wie gewohnt:
Dim nFNr As Integer
Dim nText As String
Open "c:\test.txt:ExtraDaten" For Binary As #nFNr
nText = Space$(LOF(nFNr))
Get #nFNr, , nText
Close #nFNr
Debug.Print nText
Das funktioniert auch genau so mit den übrigen Modi zum Schreiben und Lesen von Dateien, Output, Append und Input, und natürlich auch für Random-Dateien. Was Sie in einem zusätzlichen Streams (sie können beliebig viele anlegen) ablegen, bleibt Ihnen überlassen.
Zum Löschen eines zusätzlichen Streams müssen Sie die API-Funktion DeleteFile verwenden - der Einfachheit halber als "KillStream" deklariert:
Private Declare Function KillStream Lib "kernel32" _
Alias "DeleteFileA" (ByVal lpFileName As String) As Long
Dieser Funktion übergeben Sie wie zum Öffnen den vollständigen Stream-Namen (Dateiname plus Stream-Name) - beispielsweise:
KillStream "c:\test.txt:ExtraDaten"
Umbenennen können Sie einen Stream nicht. Sie können nur seinen Inhalt auslesen, unter einem neuen Stream-Namen wieder ablegen. Anschließend löschen Sie den alten Stream.
Ein paar winzig kleine Haken haben diese zusätzlichen Streams allerdings. Die Angabe der Größe einer Datei bleibt von den Inhalten der zusätzlichen Streams unberührt. Eine scheinbare leere Datei mit einer Länge von 0 Bytes kann also in Wahrheit sogar sehr umfangreiche Daten enthalten - in ihren zusätzlichen Streams. Ebensowenig wirkt sich der Stream-Inhalt auf das verfügbare Kontingent eines Datenträgers aus. Ein weiterer Haken ist, dass der Erhalt der zusätzlichen Streams auf NTFS 5-Datenträger beschränkt ist. Beim Kopieren oder Verschieben auf Datenträger mit anderen Dateisystemen, etwa FAT16 oder FAT32, Floppy-Disks, CD-ROMS u.a. gehen die zusätzlichen Streams leider verloren. Es erfolgt jedoch immerhin eine Warnung vor dem Kopieren oder Verschieben auf einen solchen Datenträger.
Der letzte Haken ist eher nur vorläufig ein solcher. Im Moment kann ich Ihnen noch keine Möglichkeit bieten, aus einer Datei eine Übersicht auszulesen, welche Streams sie enthält. Das wird einem weiteren Artikel vorbehalten bleiben. Sie können sich allerdings damit behelfen, in einem separaten Stream selbst ein Inhaltsverzeichnis zu verwalten.
|