Un esplora risorse in ASP


Lo scopo principale di queste pagine ASP è quello della visualizzazione del contenuto di una qualsiasi directory del disco fisso del server su cui queste pagine risiedono.

In questa prima parte verrà descritto come realizzare delle semplici pagine ASP che visualizzeranno solamente il nome delle directory ed i relativi file, nella seconda parte (ancora in fase di realizzo) sarà possibile vedere anche il contenuto del singolo file.

Struttura dell'applicazione

L'applicazione è strutturata su tre frame in cui vengono mostrati tutti i dati essenziali ovvero:

  1. Il percorso corrente
  2. Le directory in esso contenute
  3. I file presenti sul percorso e la loro struttura
costituiti da tre file:

  1. percorso.asp
  2. directory.asp
  3. file.asp
  4. visualizza.asp

ed il file "portante": index.asp

I file percorso.asp, directory.asp, file.asp e visualizza.asp, con qualche piccola modifica, sono dei file indipendenti l'uno dall'altro uniti tra loro dal file index.asp che si preoccupa di inviare a tutti e tre lo stesso paramentro "percorso".

Diversamente da come si potrebbe presupporre, l'applicazione viene avviata richiamando il file directory.asp e non index.asp.

Vediamo quindi la struttura di ogni singolo file .asp partendo proprio da directory.asp:

La prima operazione che viene eseguita è la richiesta del valore assegnato al parametro percorso:

<%

Percorso = Trim(LCase(Request.QueryString("percorso")))

Quindi viene analizzato questo valore. Se quest'ultimo è uguale a "" (stringa vuota), l'applicazione è stata appena avviata, quindi viene richiamato il file index.asp inserendoci anche il parametro di default percorso=c:\.

If Percorso = "" then

Response.redirect "index.asp?percorso=c:\"

Else

Diversamente, se percorso è valorizzato, controlla che sia presente come carattere finale \ (la slash), viene quindi inserito anche un semplice form per consentire il cambio di unità. Le istruzioni Right e Left consentono di analizzare i caratteri a destra e a sinistra di una stringa per un numero pari di caratteri a quelli specificati:

If Right(Percorso,1) <> "\" then Percorso = Percorso & "\"

%>

<FORM METHOD=GET ACTION="directory.asp">

<INPUT TYPE=TEXT NAME="percorso" VALUE="<%=Left(Percorso,2)%>"><BR>

<INPUT TYPE=SUBMIT VALUE="Cambia unità">

</FORM>

<%

Viene quindi richiamata la function che, in semplice testo, inserisce tutti i nomi delle cartelle presenti sul percorso corrente:

Mostra_Directory Percorso

End If

Il contenuto della directory

Function Mostra_Directory(cartella)

Vengono ora settate le variabili Fso, FL, ed SF aventi le relative funzioni di: collegamento all'oggetto Scripting per l'utilizzo della classe FileSystemObject, ricerca delle directory presenti sul percorso e, elenco delle sottodirectory

Set Fso = CreateObject("Scripting.FileSystemObject")

Set FL = fso.GetFolder(cartella)

Set SF = fl.SubFolders

Viene quindi processato il valore della variabile cartella per inserire, se necessario, il link verso la cartella precedente. Nel caso in cui la lunghezza della stringa contenuta nella variabile cartella sia pari a tre caratteri significa che il valore della variabile indica la root del disco su cui stiamo lavorando (a:\, c:\, d:\, etc.) e quindi il link sopracitato non deve essere inserito:

If Len(cartella) > 3 then

Precedente = ""

Per l'inserimento del link è necessario ricostruire il percorso della cartella precedente. Questa operazione è molto semplice infatti, supponendo che cartella abbia come valore c:\inetpub\wwwroot\, sarà sufficiente ricercare il secondo slash a partire a destra (c:\inetpub\wwwroot\) e quindi assegnare ad una variabile precedente il valore c:\inetpub\:

For f = len(cartella)-1 to 1 step -1

If Mid(cartella,f,1) = "\" and Precedente = "" then

Precedente = Mid(cartella,1,f)

End If

Next

Response.write "<a href='index.asp?percorso=" & Precedente

Response.write "' TARGET='_parent'>..</A><BR>"

End If

Dopo tutti questi controlli, finalmente si arriva al cuore di tutto, la procedura For Each per la creazione dell'elenco delle directory:

For Each FL in SF

Sotto_Cartella = FL.Name

If Len(cartella) < 3 then

Response.write Sotto_Cartella & "<BR>"

Else

Response.write "<a href='index.asp?percorso=" & Percorso & Sotto_Cartella & "' TARGET='_parent'>" & Sotto_Cartella & "</A><BR>"

End If

Next

Il ciclo For Each può essere compreso se traduciamo "letteralmente" dall'inglese all'italiano ottenendo, For Each FL in SF . Next in luogo di Per Ogni FL in SF . Ripeti

Quindi, il ciclo si ripeterà sino a quando i valori di FL (le directory presenti sul percorso corrente) sono compresi all'interno di SF (la directory principale del percorso corrente).

End Function

%>

Da una rapida occhiata, si può vedere che tutti i link creati da questa pagina (ma anche dagli altri file .asp ancora da analizzare) richiamano sempre il file index.asp con il parametro percorso.

Il cuore del sistema

Vediamo quindi la struttura del file index.asp che è relativamente semplice:

<%

' Reperimento variabili

Percorso = Request.QueryString("percorso")

If Percorso <> "" then

Link_1 = "percorso.asp?percorso=" & Percorso

Link_2 = "directory.asp?percorso=" & Percorso

Link_3 = "file.asp?percorso=" & Percorso

%>

<FRAMESET ROWS="10%,* " FRAMEBORDER=0 BORDER=0 NORESIZE>

<FRAME NAME="percorso" SRC="<%=Link_1%>">

<FRAMESET COLS="25%,* " FRAMEBORDER=0 BORDER=0 NORESIZE> <!-- Indiquer la grandeur de vos cadres -->

<FRAME NAME="directory" SRC="<%=Link_2%>">

<FRAME NAME="file" SRC="<%=Link_3%>">

</FRAMESET>

</FRAMESET>

<%Else

Response.redirect "default.asp"

End If%>

Il file analizza il valore contenuto nel parametro percorso, se quest'ultimo non contiene alcun valore, richiama la pagina default.asp, diversamente utilizza questo valore per creare il link necessario al caricamento delle varie parti ed assegnandone i valori alle variabili link_1, link_2, e link_3.

A questo punto crea la pagina suddivisa nei tre frame necessari per un'ottimale utilizzo del programma:

Un frame orizzontale in alto di nome percorso in cui viene caricato il file percorso.asp, un frame verticale (sinistro) di nome directory in cui viene caricato il file directory.asp ed un frame verticale (destro) di nome file dove viene inserito in file file.asp.

Il file percorso.asp ha come unico scopo la visualizzazione del percorso corrente e l'inserimento di un link per il refresh di tutti e tre i frame:

<%

' Verifica il valore del parametro "Percorso"

Percorso = Request.QueryString("percorso")

%>

<TABLE CELLSPACING=0 CELLPADDING=0 WIDTH=100%>

<TR>

<TD ALIGN=LEFT WIDTH=85%><FONT FACE="Arial" SIZE=2><%=Percorso%></FONT></TD>

<TD ALIGN=RIGHT WIDTH=15%><FONT FACE="Arial" SIZE=2>

<A HREF="index.asp?percorso=<%=Percorso%>" TARGET="_parent">Refresh</A>

</FONT>

</TD>

</TR>

</TABLE>

File di estrema semplicità, recupera il valore inserito nel parametro percorso e crea quindi una tabella costituita da due celle, la prima visualizza il valore appena recuperato mentre nella seconda cella viene inserito il link di refresh che, semplicemente, richiama il file index.asp con l'aggiunta del parametro percorso.

Il file file.asp consente la visualizzazione dei file contenuti all'interno della directory corrente con la possibilità di aggiungere alla destra del nome del file, una piccola descrizione:

<%

Percorso = Request.QueryString("percorso")

If Right(Percorso,1) <> "\" then Percorso = Percorso & "\"

Set fs = CreateObject("Scripting.FileSystemObject")

Set f = fs.GetFolder(Percorso)

Set fc = f.Files

Le prime 5 righe del file eseguono operazioni che già abbiamo visto nel file directory.asp con l'unica differenza che le variabili che vengono utilizzate, sono diverse. Utilizzando il ciclo For Each .Next ricerchiamo tutti i file presenti nella directory corrente:

Numero_File = 0

FP = ""

DF = ""

Le tre variabili Numero_File, FP e DF vengono utilizzate rispettivamente per conteggiare il numero di file trovati, il nome e l'estensione del file trovato, la descrizione aggiuntiva.

For Each whatever in fc

Nome_File = Trim(LCase(whatever.name))

La procedura IF seguente, permette di verificare che nella variabile Nome_File sia inserito almeno un valore e quindi procedere alla sua analisi:

Prendendo in considerazione solo gli ultimi 4 caratteri del nome del file, possiamo analizzare la sua estensione. Il motivo per cui vengono utilizzati gli ultimi 4 caratteri dipende dal fatto che alcuni tipi di file hanno estensioni a 4 lettere o più: HTML, DHTML.

Alle due variabili FP e DF viene, di volta in volta, aggiunto il testo relativo al file. I casi che vengono presi in esame riguardano essenzialmente tre tipi di file: I file di testo, i file comuni, tutti gli altri tipi di file.

Nel caso di file di testo è possibile creare un link verso la pagina visualizza.asp che ne permette la lettura e la modifica. Il link richiede due parametri: il classico Percorso e File ovvero il nome del file da visualizzare:

If Nome_File <> "" Then Numero_File = Numero_File + 1

Select Case Right(Nome_File,4)

Case ".txt"

'FP = FP & Nome_File & "<BR>"

FP = FP & "<A HREF='visualizza.asp"

FP = FP & "?percorso=" & Percorso

FP = FP & "&file=" & Nome_File

FP = FP & "'>" & Nome_File & "</A><BR>"

DF = DF & "File di testo<BR>"

Case ".asp"

FP = FP & "<A HREF='visualizza.asp"

FP = FP & "?percorso=" & Percorso

FP = FP & "&file=" & Nome_File

FP = FP & "'>" & Nome_File & "</A><BR>"

DF = DF & "Active Server Pages<BR>"

Case ".htm", "html"

FP = FP & "<A HREF='visualizza.asp"

FP = FP & "?percorso=" & Percorso

FP = FP & "&file=" & Nome_File

FP = FP & "'>" & Nome_File & "</A><BR>"

DF = DF & "Pagina web<BR>"

Nel caso in cui i file non sono editabili ma sono conosciuti, la variabile FP conterrà il solo nome del file mentre la DF la relativa descrizione:

' Altrimenti ne visualizza solo il nome

Case ".exe", ".com"

FP = FP & Nome_File & "<BR>"

DF = DF & "File di programma<BR>"

Case ".bat"

FP = FP & Nome_File & "<BR>"

DF = DF & "File di programma (Batch)<BR>"

Case ".mdb"

FP = FP & Nome_File & "<BR>"

DF = DF & "Database<BR>"

Nei restanti casi viene inserito il solo nome del file nella variabile FP mentre non viene inserito nulla nella variabile DF:

Case Else

FP = FP & Nome_File & "<BR>"

DF = DF & "<BR>"

End Select

Next

%>

Ora viene creata la tabella in cui verranno inserite le variabili FP e DF in due celle diverse. Nel caso in cui la variabile Numero_File sia uguale a zero, questa tabella non verrà creata ma verrà inserito un messaggio indicante la mancanza di file nella directory in esame:

<FONT FACE="Arial" SIZE=2>

<%If Numero_File = 0 then%>

Nella directory corrente non sono presenti file.

<%ElseIf Numero_File = 1 then%>

E' stato trovato un solo file:<HR>

<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>

<TR>

<TD ALIGN=LEFT><FONT FACE="Arial" SIZE=2><%=FP%></FONT></TD>

<TD ALIGN=LEFT><FONT FACE="Arial" SIZE=2><%=DF%></FONT></TD>

</TR>

</TABLE>

<%Else%>

Sono stati trovati <%=Numero_File%> File:<HR>

<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%>

<TR>

<TD ALIGN=LEFT><FONT FACE="Arial" SIZE=2><%=FP%></FONT></TD>

<TD ALIGN=LEFT><FONT FACE="Arial" SIZE=2><%=DF%></FONT></TD>

</TR>

</TABLE>

<%End If%>

La visualizzazione dei file

L'ultima parte da analizzare è il file visualizza.asp, il file che ci permetterà di modificare i file di testo direttamente da Internet senza la necessità di programmi FTP o altro.

Prima di vederne il sorgente è necessario aprire una piccola parentesi sull'argomento che andremo a trattare.

Per poter modificare i file presenti sul disco fisso del server su cui risiedono le nostre pagine, è necessario avere i dovuti permessi di lettura-scrittura ma pochissimi Provider rilasciano questi permessi a persone esterne visto e considerato che, con questo programma, è possibile visualizzare qualsiasi aspetto del computer su cui risiedono le pagine.

Naturalmente i permessi di lettura-scrittura vengono attivati a livello della singola directory e quindi, all'esterno di essa, non è possibile scrivere (e il nostro programma darebbe errore) ma il problema non è quello della scrittura ma della lettura (violazione della privacy altrui) perciò se utilizzerete questo "programma" in maniera intelligente, potrete apprezzarne le qualità, i pregi e i difetti (e magari correggerli!) altrimenti sarebbe solo un inutile spreco di tempo e spazio.

Passiamo quindi ad analizzare la struttura dell'ultimo file: visualizza.asp

<%

' Reperimento parametri

Percorso = Trim(Lcase(Request.QueryString("percorso")))

Nome_File = Trim(Lcase(Request.QueryString("file")))

Azione = LCase(Request.QueryString("azione"))

%>

Il file utilizza 3 parametri: Percorso, File, Azione. L'ultimo parametro Azione serve unicamente per rilevare se è stato premuto il tasto "Modifica".

Vengono visualizzate le due voci relative al percorso corrente ed il nome del file visualizzato:

<FONT FACE="Arial" SIZE=2>

File visualizzato: <B><%=Nome_File%></B><BR>

Percorso: <B><%=Percorso%></B></FONT>

Viene quindi letto il file ed inserito direttamente all'interno di una TextArea di un semplice modulo Form costituito dalla TextArea e dal tasto di Submit per la modifica:

<%

Set Fso = CreateObject("Scripting.FileSystemObject")

' Verifica se è stato premuto il tasto di memorizzazione

If Azione = "" then

Set Leggi = Fso.OpenTextFile(Percorso & Nome_File)

%>

<FORM METHOD=GET ACTION="visualizza.asp">

<TEXTAREA NAME="edit_file" ROWS=15 COLS=68><%=Leggi.ReadAll%></TEXTAREA><BR>

<INPUT TYPE=SUBMIT NAME="azione" VALUE="Memorizza">

<INPUT TYPE=HIDDEN NAME="percorso" VALUE="<%=Percorso%>">

<INPUT TYPE=HIDDEN NAME="file" VALUE="<%=Nome_File%>">

</FORM>

<%

Else

Set Scrivi = Fso.CreateTextFile(Percorso & Nome_File, True)

Scrivi.Write (Request.QueryString("edit_file"))

%><BR><BR><FONT FACE="Arial" SIZE=2>Il file è stato correttamente modificato.</FONT><BR><%

End If

%>

<A HREF="file.asp?percorso=<%=Percorso%>">Visualizza contenuto directory</A>

Si noti che la lettura del file è stata fatta utilizzando l'istruzione Leggi.ReadAll che legge tutto il contenuto del file. Per la sua scrittura è stato usato il comando Scrivi.Write (Request.QueryString("edit_file"))

Dove il parametro edit_file altro non è che il nome che è stato assegnato alla TextArea.

Visto e considerato che la visualizzazione del contenuto del file sostituisce la pagina in cui venivano elencati i file presenti sulla directory corrente, è stato aggiunto un link che permettesse di "uscire" dalla visualizzazione del file e ritornare all'elenco dei file stessi.

Conclusioni

In questo articolo abbiamo visto come sia potente l'utilizzo dell'oggetto FileSystemObject.
Ovviamente un oggetto di questo tipo va usato con cautela, perchè potrebbe causare seri danni, se ci fossero degli errori nell'implementazione di alcune sue funzioni.

In ogni caso questo articolo può risultare molto utile per iniziare ad utilizzare in maniera inteligente questo oggetto e le sue proprietà.

[ Scarica gli esempi dell'articolo ]