Funzioni utili per gestire files di testo
Chi è abituato ad usare qualsiasi altro linguaggio di programmazione
si trova stupito di fronte a vbScript, in quanto non esistono le consuete
istruzioni "open" e "close", ma per accedere ai files è necessario creare
una istanza di un oggetto dedicato a questo scopo.
Rimandando una trattazione più completa del file system object, illustro
qui di seguito alcune funzioni che permettono in modo semplice di creare
e manipolare un file ascii. Non sono funzioni mie, ma averle trovate già
pronte mi ha fatto molto piacere. Sono ben fatte ed hanno una buona gestione
degli errori. Infatti alcune mie funzioni davano per scontato che la lettura
o la scrittura andassero a buon fine. Cosa che non sempre succede.
Una di queste funzioni (FindInFileR) è mia. In un programma generavo
una lista dei processi attivi in memoria. Mi serviva una funzione per
vedere se l'antivirus era effettivamente funzionante oppure no.
L'approccio di queste funzioni non è dei più efficienti, in termini di
velocità di esecuzione. Per esempio, per scrivere 10 righe si chiama dieci
volte la funzione che scrive una riga, istanziando e rimuovendo per altrettante
volte l'oggetto FSO.
Tuttavia in alcuni casi si può preferire la velocità nella scrittura
del codice piuttosto che la velocità di esecuzione, salvo poi ritornare
sullo script per ottimizzarlo con calma.
Prima di tutto definiamo il nome del file al quale vogliamo accedere
in lettura, in scrittura o in append (aggiunge alla fine del file). Dopo
che è stato fatto posso usare queste funzioni.
FName="c:\test.txt"
if File_IsExist( FName ) then msgbox("Il file esiste già")
File_Create( FName ) 'Crea il file
File_AppendLine( FName, "Riga scritta nel file" )
File_AppendLine( FName, "Seconda riga scritta nel file" )
Il file viene chiuso automaticamente dopo ogni scrittura.
Per cancellarlo uso quest'altra funzione.
File_Delete( FName )
Posso anche cercare una singola riga che contiene un testo determinato.
Questa funzione scorre il file specificato e quando incontra una riga
che contiene "prompt" (nell'esempio) restituisce l'intera riga.
Se non trova nulla restituisce una stringa nulla.
msgbox FindInFileR("c:\autoexec.bat", "prompt")
oppure caricare l'intero file in una variabile.
A = File_ReadEntireFile( FName )
e magari creare un vettore delle singole righe (identificate dal fatto
che terminano con un ritorno a capo).
vett = split (a, vbcrlf)
for i=0 to ubound (vett)
msgbox vett(i)
next
Insomma, con questa manciata di funzioni
ci si può dedicare al cuore del
programma senza preoccuparsi troppo della creazione dell'output su file.
Se trovate utili queste funzioni potreste metterle,
insieme ad altre, in un file da includere nei vostri script. In questo
modo basterà fare riferimento alla libreria per avere automaticamente
queste estensioni. Per sapere come includere una libreria ho scritto una
pagina apposita sulla funzione "include".
Copia il programma riportato qui sotto in un file
con estensione ".vbs" oppure scarica l'archivio
zip contentente lo script queste funzioni contenute nel file fso1.vbs.
'========================================================================
' Crea un file. Nel caso in cui gia' esiste, lo sovrascrive
'========================================================================
Sub File_Create( sFileName )
Dim opfs, fp
On Error Resume Next
File_Create=True
Set opfs = CreateObject("Scripting.FileSystemObject")
if Err <> 0 then
File_Create=False
Exit Function
end if
Set fp = opfs.CreateTextFile( sFileName, True )
if Err <> 0 then
set opfs = nothing
File_Create=False
Exit Function
end if
fp.Close
set opfs = nothing
Err.Clear
On Error Goto 0
End Sub
'========================================================================
' Controlla se esiste il file passato come parametro.
' Ritorna TRUE nel caso in cui il file E' stato trovato.
'========================================================================
Function File_IsExist( sFileName )
Dim opfs
On Error Resume Next
File_IsExist=False
Set opfs = CreateObject("Scripting.FileSystemObject")
if Err <> 0 then
Exit Function
end if
' Test per l'esistenza del file
File_IsExist = opfs.FileExists( sFileName )
set opfs = nothing
Err.Clear
On Error Goto 0
End Function
'========================================================================
' Legge il contenuto del file
' Ritorna il testo letto
'========================================================================
Function File_ReadEntireFile( sFileName )
Const ForReading = 1 'Apre un file in lettura.
Dim opfs, fp, retstring
On Error Resume Next
File_ReadEntireFile = ""
Set opfs = CreateObject("Scripting.FileSystemObject")
if Err <> 0 then
Exit Function
end if
Set fp = opfs.OpenTextFile( sFileName, ForReading, False )
if Err <> 0 then
set opfs = nothing
Exit Function
end if
Do While fp.AtEndOfStream <> True
retstring = retstring + fp.ReadLine
Loop
fp.Close
set opfs = nothing
File_ReadEntireFile = retstring
Err.Clear
On Error Goto 0
End Function
'========================================================================
' Aggiunge al file sFileName una riga
'========================================================================
Function File_AppendLine( sFileName, sData )
Const ForAppending= 8
Dim opfs, fp, retstring
On Error Resume Next
File_AppendLine=False
Set opfs = CreateObject("Scripting.FileSystemObject")
if Err <> 0 then
Exit Function
end if
Set fp = opfs.OpenTextFile( sFileName, ForAppending, False )
if Err <> 0 then
set opfs = nothing
Exit Function
end if
fp.WriteLine sData
if Err <> 0 then
set opfs = nothing
Exit Function
end if
fp.Close
File_AppendLine=True
set opfs = nothing
Err.Clear
On Error Goto 0
End Function
'========================================================================
' Crea il file sFileName ed aggiunge al file una riga
'========================================================================
Function File_WriteLine( sFileName, sData )
Const ForWriting = 2 'Apre un file in scrittura.
Dim opfs, fp
On Error Resume Next
File_WriteLine=False
Set opfs = CreateObject("Scripting.FileSystemObject")
if Err <> 0 then
Exit Function
end if
Set fp = opfs.OpenTextFile( sFileName, ForWriting, False )
if Err <> 0 then
set opfs = nothing
Exit Function
end if
fp.WriteLine sData
if Err <> 0 then
set opfs = nothing
Exit Function
end if
fp.Close
File_WriteLine=True
set opfs = nothing
Err.Clear
On Error Goto 0
End Function
'========================================================================
' Cancella il file sFileName
'========================================================================
Function File_Delete( sFileName )
Dim opfs
On Error Resume Next
File_Delete = False
Set opfs = CreateObject("Scripting.FileSystemObject")
if Err <> 0 then Exit Function
opfs.DeleteFile sFileName, True
if Err <> 0 then Exit Function
File_Delete = true
set opfs = nothing
Err.Clear
On Error Goto 0
End Function
'========================================================================
' Cerca nel file sFileName l'occorrenza str e ritorna la riga
'========================================================================
Function FindInFileR( sFileName, str )
Const ForReading = 1 'Apre un file in lettura.
Dim fso, fp
Set fso = CreateObject("Scripting.FileSystemObject")
Set fp = fso.OpenTextFile( sFileName, ForReading, False)
FindInFileR = ""
Do While fp.AtEndOfStream <> True
strdata = fp.ReadLine
if instr(strdata ,str ) then
FindInFileR = strdata
fp.Close
exit function
End If
Loop
fp.Close
End Function
Cenati Giovanni
|