Introduzione al FileSystemObject


Home Page | Comments | Articles | Faq | Documents | Search | Archive | Tales from the Machine Room | Contribute
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'insieme Drives ed il singolo oggetto Drive
  • l'insieme Folders ed il singolo oggetto Folder
  • l'insieme Files ed il singolo oggetto File
  • l'oggetto TextStream
Per ogni insieme (elenco) c'e' il corrispondente singolo oggetto.

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):
MetodoScopo
FileExists Verifica se il file specificato esiste.
CreateTextFile Viene utilizzato per creare un nuovo file di testo che verra' poi riempito
OpenTextFile Viene usato per accedere ad un file gia' esistente per leggerne il contenuto
DeleteFile Si utilizza per cancellare un file sul disco
FolderExists Verifica se la directory specificata esiste
CreateFolder Si utilizza per creare una nuova directory nel disco
DeleteFolder Serve a cancellare una directory esistente dal disco
GetFolder rende 'attiva' la directory specificata
GetFile rende 'attivo' il file specificato
CopyFile Crea una copia del file indicato, cambiando nome alla copia
GetAbsolutePath Ritorna il percorso 'assoluto' cioe' a partire da / del file
GetTempName Costruisce 'al volo' il nome di un file 'temporaneo' da utilizzarsi
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)

Comment from:
Comment:


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 was composed with VIM, now is composed with VIM and the (in)famous CMS FdT.

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.
Web Interoperability Pleadge is this a valid html document?

Ultimo aggiornamento: 01 Novembre 2000