L'oggetto
TextStream, utilizzabile sia in Visual Basic che in
VBScript, serve per facilitare l'accesso ai file di testo
in modalità sequenziale ed è saldamente legato
a FileSystemObject analizzato in precedenza, in quanto viene
inizializzato nel momento in cui se ne richiama il metodo
CreateTextFile oppure il metodo OpenTextFile.
In quel momento infatti all'oggetto TextStram, inizialmente
vuoto, viene assegnato un file (indicandone il percorso) che
potrà poi essere gestito in lettura, nel primo caso
e scrittura nel secondo utilizzando i metodi appropriati.
Ad esempio, se si desidera associare il file di percorso "C:\1dat2.txt"
all'oggetto TextStream in fase di creazione o di scrittura
del file:
Set
FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.CreateTextFile("C:\1dat2.txt",
True, False)
TextStream1.Close |
E'così
stato subito introdotto il metodo Close che chiude
il file una volta eseguita l'operazione di lettura e/o scrittura.
E' importante ricordare che il primo parametro del metodo
CreateTextFile rappresenta il percorso del file compreso di
nome ed estensione, il secondo indica se si desidera (True)
o meno (False) sovrascrivere un file eventualmente già
esistente al percorso indicato. Infine l'ultimo parametro
indica il formato del nuovo file: Unicode (True) o ASCII (False).
Se si vuole scrivere una linea di testo sul file in modo sequenziale
si dovrà utilizzare il metodo WriteLine, indicando
solamente la stringa di testo che rappresenta il testo da
inserire nel file.
Ad esempio:
Set
FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.CreateTextFile("C:\1dat2.txt",
True, False)
With TextStream1
.WriteLine ("Prima riga")
.WriteLine ("Seconda riga")
.WriteLine
.WriteLine ("Quarta riga")
.Close
End With |
Questo
blocco darà il seguente risultato:
nel
quale è semplice notare che se si indica WriteLine
senza la stringa di testo, sul file verrà scritto un
carattere di nuova riga corrispondente alla pressione del
tasto Invio.
Lo stesso risultato si otterrebbe utilizzando la costante
vbCrLf:
.WriteLine
("Seconda riga") & vbCrLf
.WriteLine ("Quarta riga") |
Abbastanza
simile a WriteLine è il metodo Write che col
quale però le stringhe specificate vengono scritte
nel file senza spazi o altri caratteri di separazione e senza
passare da una riga all'altra.
Ad esempio:
Set
FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.CreateTextFile("C:\1dat2.txt",
True, False)
With TextStream1
.Write ("Prima riga")
.Write ("Seconda riga")
.Write ("Quarta riga")
.Close
End With |
equivale
al seguente risultato:
In
questo caso inoltre l'indicazione della stringa di testo è
obbligatoria, perciò per ottenere un risultato simile
al precedente bisognerà fare uso ancora una volta della
costante vbCrLf oppure utilizzare il metodo WriteBlankLines
che va a capo (scrive caratteri di nuova riga) tante volte
quante indicategli come parametro.
Ad esempio, se si vuole andare a capo tre volte, se si è
utilizzato il metodo Write si otterrà un risultato
del tipo:
mentre
se si utilizza il metodo WriteLine:
E
come si può notare c'è una riga di differenza
tra i due esempi perché mentre WriteLine include già
il ritorno a capo, per il metodo Write non è così.
Se invece si desidera effettuare un accesso in lettura al
file si dovrà utilizzare il metodo OpenTextFile dell'oggetto
FileSystemObject. Anche in questo modo come per il caso di
CreateTextFile, viene assegnato file del percorso indicato
all'oggetto TextStream:
Nella sintassi di OpenTextFile si dovranno indicare
rispettivamente il percorso del file compreso di estensione
(ad esempio "C:\1dat2.txt"), la modalità
di lettura (ForReading che apre il file in sola lettura
e corrisponde alla costante 1, ForAppending che apre
il file e scrive alla fine del suo contenuto a cui corrisponde
la costante 8). Inoltre si dovrà indicare se creare
il file (True) o meno (False) nel caso in cui questo non esista
nel percorso specificato e per finire il formato del file
aperto:
TristateUseDefault che corrisponde alla costante -2,
apre il file utilizzando l'impostazione predefinita di sistema,
TristateTrue che corrisponde alla costante -1, apre
il file in formato Unicode, TristateFalse costante
0, apre il file in formato ASCII.
Ad esempio:
Set
FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.OpenTextFile("C:\1dat2.txt",
True, False) |
Nell'accesso
in lettura (ma anche in scrittura) i metodi disponibili sono
Read, ReadAll e ReadLine. Read, non fa altro che leggere il
numero di caratteri specificato del file assegnato all'oggetto
TextStream e restituirne così la stringa risultante.
Si consideri il primo esempio: abbiamo cioè quattro
righe: Prima riga, Seconda riga, una riga vuota e Quarta riga:
Const
ForReading = 1, ForWriting = 2, ForAppending = 8, _
TristateUseDefault = -2, TristateTrue = -1, TristateFalse
= 0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.OpenTextFile("C:\1dat2.txt",
ForReading, _ TristateUseDefault)
MsgBox TextStream1.Read(15)
TextStream1.Close |
Verrà
ritornata così una stringa di lunghezza 15 pari ai
primi 15 caratteri del contenuto del file, spazi compresi.
Il metodo ReadLine invece legge un'intera riga escluso il
carattere di ritorno a capo (la costante vbCrLf equivalente
alla pressione del tasto Invio).
Indicare:
Const
ForReading = 1, ForWriting = 2, ForAppending = 8, _
TristateUseDefault = -2, TristateTrue = -1, TristateFalse
= 0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.OpenTextFile("C:\1dat2.txt",
ForReading, _ TristateUseDefault)
MsgBox TextStream1.ReadLine
TextStream1.Close |
equivale
a leggere automaticamente la prima riga. Se ad esempio si
vuole leggere la seconda bisogna saltare di riga attraverso
i metodi Skip e SkipLine che si analizzeranno tra poco.
Infine il metodo ReadAll permette la lettura dell'intero
contenuto del file, spazi naturalmente compresi:
Const
ForReading = 1, ForWriting = 2, ForAppending = 8, _
TristateUseDefault = -2, TristateTrue = -1, TristateFalse
= 0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.OpenTextFile("C:\1dat2.txt",
ForReading, _ TristateUseDefault)
MsgBox TextStream1.ReadAll
TextStream1.Close |
Il
risultato sarà:
Ritornando
ai metodi Skip e SkipLine, si può notare
che la loro utilità nella lettura in quanto consentono
di passare da una riga all'altra (nel caso di SkipLine) e da
un carattere all'altro (nel caso di Skip), senza però
la possibilità di tornare ad una riga o ad un carattere
precedente.
Se si desidera saltare i primi 5 caratteri e leggere quello
che rimane della prima riga:
Const
ForReading = 1, ForWriting = 2, ForAppending = 8, _
TristateUseDefault = -2, TristateTrue = -1, TristateFalse
= 0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.OpenTextFile("C:\1dat2.txt",
ForReading, _ TristateUseDefault)
TextStream1.Skip 5
MsgBox TextStream1.ReadLine
TextStream1.Close |
Il
risultato questa volta sarà:
Se invece si desidera saltare alla seconda riga e leggerla:
Const
ForReading = 1, ForWriting = 2, ForAppending = 8, _
TristateUseDefault = -2, TristateTrue = -1, TristateFalse
= 0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.OpenTextFile("C:\1dat2.txt",
ForReading, _ TristateUseDefault)
TextStream1.SkipLine
MsgBox TextStream1.ReadLine
TextStream1.Close |
E
questa volta otterremo la seconda riga per esteso:
Perciò
basterà richiamare il metodo SkipLine tante volte quante
sono le righe che si vuole saltare, utilizzando a limite un
ciclo For
Next.
Le proprietà dell'oggetto TextStream sono molto utili
se utilizzate unitamente ai metodi appena visti. Ad esempio
la proprietà Line permette di determinare la linea
corrente (quella cioè su cui si è posizionato
il puntatore di riga). Appena si apre un file di testo il puntatore
passa subito alla prima riga perciò:
Const
ForReading
= 1, ForWriting = 2, ForAppending = 8, _
TristateUseDefault = -2, TristateTrue = -1, TristateFalse
= 0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.OpenTextFile("C:\1dat2.txt",
ForReading, _ TristateUseDefault)
MsgBox TextStream1.Line
TextStream1.Close |
darà
il risultato:
Per
determinare invece la posizione del puntatore in relazione al
carattere correntemente considerato si usa la proprietà
Column:
Const
ForReading = 1, ForWriting = 2, ForAppending = 8, _
TristateUseDefault = -2, TristateTrue = -1, TristateFalse
= 0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.OpenTextFile("C:\1dat2.txt",
ForReading, _ TristateUseDefault)
MsgBox TextStream1.Column |
Per
sapere poi se il puntatore di riga si trova al termine del file
di testo si utilizza il metodo AtEndOfStream. Verrà
così restituito il valore True in caso affermativo ed
il valore False nell'ipotesi opposta. Infine si determina se
il puntatore dei caratteri (che quindi opera su un un'unica
riga) è al termine della riga attraverso il metodo AtEndOfLine.
Anche in questo caso True indicherà il termine della
riga e False il caso opposto.
Ecco di seguito due esempi; quello del metodo AtEndOfStream:
Const
ForReading
= 1, ForWriting = 2, ForAppending = 8, _
TristateUseDefault = -2, TristateTrue = -1, TristateFalse
= 0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.OpenTextFile("C:\1dat2.txt",
ForReading, _ TristateUseDefault)
For i = 1 To
2
TextStream1.SkipLine
Next i
MsgBox TextStream1.AtEndOfStream & " " &
TextStream1.Column
TextStream1.Close |
E
quello del metodo AtEndOfLine:
Const
ForReading = 1, ForWriting = 2, ForAppending = 8, _
TristateUseDefault = -2, TristateTrue = -1, TristateFalse
= 0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.OpenTextFile("C:\1dat2.txt",
ForReading, _ TristateUseDefault)
TextStream1.Skip 10
MsgBox TextStream1.AtEndOfLine & " " &
TextStream1.Column
TextStream1.Close |
I
metodi AtEndOfStream e AtEndOfLine possono risultare utili per
eseguire un ciclo rispettivamente per tutte le righe del testo
e per tutti i caratteri della riga.
Ad esempio, se si desidera visualizzare una finestra di messaggio
che indichi il testo di ogni riga, senza utilizzare il ciclo
For
Next perché si suppone che non si conoscano
a priori il totale delle righe del file:
Const
ForReading = 1, ForWriting = 2, ForAppending = 8, _
TristateUseDefault = -2, TristateTrue = -1, TristateFalse
= 0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream1 = FSO.OpenTextFile("C:\1dat2.txt",
ForReading, _ TristateUseDefault)
Do While Not TextStream1.AtEndOfStream
MsgBox TextStream1.ReadLine
Loop |
Una
cosa simile può essere fatta sostituendo AtEndOfLine
a AtEndOfStream e Read a ReadLine. In questo caso si potranno
leggere uno per uno i caratteri della linea fino alla fine di
questa. |