Introduzione al FileSystemObject |
| A cura di Davide Bianchi |
Il FileSystemObject consente di accedere tramite ASP o Scripting ai
file ed alle altre risorse della macchina (directory e dischi).
|
|
Nota
|
Questo documento tratta genericamente del File System Object
che e' accessibile sia tramite ASP che tramite
WSH, ovunque non sia specificato
chiaramente si intende che il codice presentato funziona in
entrambi i casi.
|
|||||||||||||||||||||||||||
|
Cose' il File System?
|
Il termine File System definisce genericamente quella struttura
che 'regge' i documenti e tutti gli altri file che stanno sui nostri
dischi, ogni volta che leggiamo o modifichiamo un documento su un
dischetto o sul disco fisso, mettiamo le mani nel File System di
quel disco. L'accesso e la manipolazione del file system sono funzioni basilari di ogni Sistema Operativo, e grande cura e' posta nel tentativo di preservare i dati sui dischi da eventuali cancellazioni o distruzioni non volute. Il File System Object e' (come dice il nome) un 'oggetto' che consente di manipolare direttamente gli elementi del file system, quindi di accedere ai file ed alle directory che vi sono memorizzate, crearle, modificarle e cancellarle.
|
|||||||||||||||||||||||||||
|
Un oggetto, tanti oggetti
|
In realta', per accedere ai componenti del file system si utilizzano
tanti oggetti, di cui il FileSystem stesso e' solo uno, gli oggetti
che compongono l'insieme di strumenti che ci consentono di manipolare
il file system sono:
L'oggetto FileSystemObject ci consente di accedere a tutti questi, ed attraverso questi, ai nostri file che sono sul disco. Per cominciare occorre creare un'oggetto di tipo FileSystemObject, questa e' la chiave per accedere anche a tutti gli altri, per creare l'oggetto si utilizza:
Dim fso
Set fso=CreateObject("Scripting.FileSystemObject")
Una volta fatto questo e' possibile accedere agli altri oggetti
utilizzando i vari metodi del nostro FileSystem
(nota: e' al di la' degli scopi di questo articolo il fornire
una trattazione completa di tutti i metodi del FSO, per una
trattazione piu' dettagliata riferirsi alla documentazione reperibile
sul sito Microsoft):
|
|||||||||||||||||||||||||||
|
Scorrere le directory del disco
|
Come primo esempio, molto semplice, cominciamo col vedere come e'
possibile visualizzare il contenuto della directory corrente del
disco, cioe' visualizzare tutti i file contenuti in una determinata
directory.
Dim fso ' il file system object
Dim folder ' la cartella (directory)
Dim file ' il singolo file
Dim string ' per contenere l'elenco
' N.B. assumo che 'dirName' contenga il nome della
' directory che si vuole 'listare'
' creo il FSO ed accedo alla singola cartella
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder( dirName )
' pulisco la stringa
string = ""
' ciclo su tutti i file della cartella
For Each file in folder.Files
string = string & file.name
string = string & vbCrLf
Next
' a questo punto 'string' contiene l'elenco separato
' da 'ritorni a capo'.
Set folder=Nothing
Set fso=Nothing
|
|||||||||||||||||||||||||||
|
Leggere un file di testo
|
Una volta che siamo in grado di accedere ad una directory (folder)
e di leggere i file contenuti, possiamo accedere al singolo file
e leggerne il contenuto. Questo spalanca molte possibilita', tra le quali quella di incorporare il testo del file in altri documenti
Dim fso
Dim file
Dim string
' NOTA:
' si suppone che 'fileName' contenga il nome
' del file da leggere.
' creo il FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
' pulisco la stringa
string = ""
' verifico che il file esista
If fso.FileExists( fileName ) Then
' accedo al file
Set file = fso.OpenTextFile( fileName, 1, False, 0)
' ciclo e mi leggo tutto il file
Do While file.AtEndOfStream <> True
string = string & vbCrLf & file.ReadLine
Loop
End If
' a questo punto 'stringa' contiene il testo del file
file.Close()
Set file=Nothing
Set fso=Nothing
|
|||||||||||||||||||||||||||
|
Scrivere un file
|
L'operazione di scrittura di un file e' analoga a quella di lettura,
solo che si utilizza il metodo Write al posto di quello
Read (o ReadLine).
Dim fso
Dim file
Dim string
' NOTA:
' si suppone che 'fileName' contenga il nome del
' file da scrivere.
' creo il FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
' pulisco la stringa
string = ""
' verifico che il file NON esista
If Not fso.FileExists( fileName ) Then
' accedo al file
Set file = fso.OpenTextFile( fileName, 2, True, 0)
' inserisco 3 righe nel file
file.Write "Questa e' la riga numero uno" & vbCrLf
file.Write "Questa e' la riga numero due" & vbCrLf
file.Write "Questa e' la riga numero tre" & vbCrLf
file.Close
Set file=Nothing
End If
Set fso=Nothing
|
|||||||||||||||||||||||||||
|
Modificare un file esistente
|
Il sistema piu' semplice per modificare un file gia' esistente
consiste nell'aprire il file in lettura, crearne uno nuovo in
scrittura, leggersi tutto il file originale, copiando e
modificando il contenuto nel nuovo file. Al termine si elimina
il vecchio file e si rinomina il nuovo file. Per ottenere un nuovo nome di file e' possibile utilizzare GetTempName che restituisce un nome di file ottenuto in modo casuale. Per 'rinominare' il file una volta completata l'elaborazione, si puo' usare invece MoveFile, che consente di cambiare il nome del file in un colpo solo. Il semplice codice di esempio legge un file e ne crea uno nuovo premettendo ad ogni riga 'Nuovo':
Dim fso
Dim inFile
Dim outFile
Dim riga
' NOTA:
' si suppone che 'fileName' contenga il nome del
' file da leggere.
' creo il FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
' verifico che il file di input esista
If fso.FileExists( fileName ) Then
' creo un nome di file temporaneo
newFile = fso.GetTempName
' apro i file
Set outFile = fso.OpenTextFile( newFile, 2, True, 0)
Set inFile = fso.OpenTextFile( fileName, 1, False, 0 )
' ciclo e mi leggo tutto il file di input
Do While Not inFile.AtEndOfStream
' leggo una riga
riga = inFile.ReadLine()
' copio la riga nel nuovo file aggiungendo 'nuovo' all'inizio
riga = "Nuovo " & riga & vbCrLf
outFile.Write riga
Loop
' chiudo i due file ed elimino gli oggetti
inFile.Close
outFile.Close
Set inFile = Nothing
Set outFile = Nothing
' adesso elimino il vecchio file e rinomino quello nuovo
fso.DeleteFile fileName
fso.MoveFile newFile, fileName
End If
' elimino il FileSystemObject
Set fso=Nothing
|
|||||||||||||||||||||||||||
|
Rinominare i files
|
Parecchie volte si ha il problema di rinominare un blocco di file
assegnando a tutti un nome 'coerente', per esempio un blocco di
documenti Word che devono essere chiamati Docum001.doc, Docum002.doc
e cosi' via. Questo e' proprio un lavoro per uno Script! Il codice seguente chiede l'estensione dei file da elaborare e l'inizio del nome dei nuovi file da creare, quindi cicla su tutti i file presenti e se il file ha quell'estensione, copia il file assegnandogli un nuovo nome. NOTA: Questo codice funziona con WSH, con ASP e' possibile adattarlo.
' THE FILE RENAMER
'
' Cicla su tutti i file in una directory creando nuovi
' nomi in base alle regole imposte
'
'
Dim file ' il file sotto 'processo'
Dim folder ' la directory corrente
Dim fso ' file system object
Dim inPatt ' pattern in ingresso
Dim outPatt ' pattern in uscita
Dim counter ' contatore dei file
Dim ext ' estensione del file
Dim newName ' nuovo nome da assegnare al file
' chiedo il pattern in ingresso
inPatt = ""
Do While inPatt = ""
inPatt = InputBox("Inserire l'estensione dei _
file (es. doc)", "Pattern" )
Loop
' chiedo il pattern in uscita
outPatt = ""
Do While outPatt = ""
outPatt = InputBox("Inserire il 'pattern' di _
file da creare", "Pattern" )
Loop
' Creo il FileSystemObject
Set fso=CreateObject("Scripting.FileSystemObject")
' recupero la directory corrente
Set folder=fso.GetFolder(".")
' azzero il contatore
counter = 0
' scorro tutti i file corrispondenti
For Each file in folder.Files
' verifico se il file rientra nel 'pattern' indicato
ext = Right( file.Name, 3 )
If ext = inPatt Then
' ciclo per il controllo degli errori
Do While True
' incremento il contatore di file trovati
counter = counter + 1
' creo il nuovo nome
newName = outPatt & counter & "." & inPatt
' verifico che il file non ci sia gia'
If Not fso.FileExists( newName ) Then
' Ok, rinomino
fso.MoveFile file.Name, newName
Exit Do
End If
Loop
End If
Next
' al termine del ciclo visualizzo quanti file ho elaborato
MsgBox "Sono stati elaborati " & counter & " file.", _
vbOkOnly + vbInformation, "Il Rinominatore"
|
|||||||||||||||||||||||||||
|
Conclusioni
|
Il codice presentato qui' e' stato testato con il WSH versione 1.0
e con il PWS 1.0 di FrontPage. In tutti i casi il codice ha funzionato
come si supponeva dovesse. Chiaramente, questi sono solamente degli esempi. Per ulteriori informazioni sul FileSystemObject, consultare il Tutorial del Windows Scripting Host, reperibile sul sito della Microsoft o l'MSDN (cercare FileSystemObject).
|
|
Comments Max length of comments: 1000 chars. |
4 commenti r dice il 27/05/2008 23:31: grazie, molto utile e chiaro ... ciao r Luano dice il 31/08/2008 23:28: Grazie, mi è stato molto utile per uscire da un "loop" applicativo che mi stava bloccando. JustAStudent dice il 10/11/2008 11:36: E' stato utile anche per me, dovevo rinominare un tot di cartelle con un certo pattern. OK, a dire il vero ho letto l'articolo DOPO aver fatto lo script, ma SE lo avessi letto mi sarebbe stato utile. (ops). Grazie io dice il 11/11/2008 00:31: non e la stessa cosa di usare explorer? Add a comment (max 1000 chars)
|
| L'Autore |
Davide Bianchi,
works as Unix/Linux administrator for a "network security" company of Haarlem. Contacts: mail: davide AT onlyforfun.net , ICQ: 268751033, Jabber: davideyeahsure AT gmail.com Skype: davideyahsure |
| Contribuire | Volete contribuire? Leggete come! |
| Copyright | This site is made by me with blood, sweat and gunpowder, if you want to republish or redistribute any part of it, please drop me (or the author of the article if is not me) a mail. |
This site isn't optimized for vision with any specific browser, nor
it requires special fonts or resolution.
You're free to see it as you wish.
Ultimo aggiornamento: 01 Novembre 2000