Corso di Rebol - Lezione 3
Torna all'elenco delle lezioni La gestione dei file locali e remoti

Esiste un tipo chiamato file!, che identifica i nomi dei file e delle directory e un tipo url! che identifica gli indirizzi Internet.
Un valore di tipo file! può essere scritto in modo diretto, facendolo precedere dal segno della percentuale, come in

nome-del-file: %file.txt

oppure può essere ottenuto convertendo un valore string!, magari inserito dall'utente, come in

nome-del-file: to-file ask "Scrivi il nome del file: "

Anche un valore di tipo url! può essere scritto in modo diretto, facendolo precedere dall'indicazione del protocollo da usare (in questo caso sono utili file:, http:, ftp:)

file-locale: file:file.txt
home-page: http://www.rebol.com
file-ftp: ftp://ftp.rebol.com/pub/nome

oppure può essere ottenuto convertendo un valore string!, magari inserito dall'utente, come in

mio-url: to-url ask "Uniform Resource Locator del file: "

E' molto importante tenere presente che la conversione to-url, come altre, effettua solo un controllo superficiale sul valore di partenza e in particolare non controlla l'esistenza di un prefisso valido, perché lo potremmo aggiungere dopo, per cui il risultato della conversione è si di tipo url!, ma non è necessariamente un URL valido.
Ad esempio, con la seguente riga non converto un numero intero in un indirizzo Internet valido:

mio-url: to-url 123

ma creo una parola di tipo url! il cui valore è "123".

In questo contesto il segno della percentuale equivale al prefisso file:, per cui se scrivo nome-del-file: file:file.txt oppure nome-del-file: %file.txt faccio riferimento allo stesso file.

Nella maggior parte dei casi REBOL tratta nella stessa maniera i file individuati tramite una parola di tipo file! e quelli individuati tramite una parola di tipo url!, per cui quanto segue è valido per entrambi i tipi.

Il nome di una directory è un valore di tipo file! che termina con la barra "/":

nome-della-directory: %nome/

Tutti i nomi che terminano con i due punti, come il nome di un dispositivo come "df0:", il nome di un Assign come "C:" o l'etichetta di un disco come "Workbench:" devono essere preceduti e seguiti dalla barra "/", senza i due punti:

primo-floppy: %/df0/
comandi: %/c/
il-workbench: %/Workbench/

Il separatore per i percorsi è sempre la barra "/" (anche nelle versioni per Windows) e per fare riferimento alla directory corrente si usa il nome convenzionale ".", mentre per il livello superiore si usa ".."; ad esempio per sapere il percorso completo della directory corrente si può fare:

clean-path %./

e per quello della directory superiore:

clean-path %../

Se si vuole assegnare ad una parola un valore di tipo file! che contiene caratteri non validi (come lo spazio o le parentesi), è necessario racchiudere il valore tra virgolette oppure inserirlo in una stringa e poi convertirlo, altrimenti i caratteri vengono interpretati da REBOL e generalmente si ottiene un errore; in questi casi REBOL codifica i caratteri non validi secondo lo standard di Internet:

nome: %"a[]{ }()a"
nome: to-file "a[]{ }()a"

in entrambi i casi se si stampa la parola nome si ottiene il risultato originario (senza bisogno di conversione esplicita):

print nome
a[]{ }()a

mentre per vedere quale è la rappresentazione codificata (urlencoded, che è la codifica usata per trasmettere i nomi dei files tramite il World Wide Web) si può usare mold:

print mold a
%a%5B%5D%7B%20%7D%28%29a

I comandi "DOS"

Per gestire il file system esistono le seguenti parole (che funzionano come le controparti dei vari DOS):

change-dircome unico argomento vuole il nome della nuova directory
deletecome unico argomento vuole il nome di un file o di una directory vuota
list-dirse si fornisce il nome di una directory ne mostra il contenuto, altrimenti mostra il contenuto di quella corrente
make-dircome unico argomento vuole il nome della directory da creare
renamevuole due argomenti: il primo è il vecchio nome, il secondo è il nuovo nome
what-dirnon vuole argomenti e fornisce il nome della directory nella quale ci troviamo


E` importante ricordare che tutti i nomi espliciti devono iniziare con il simbolo del percento e tutti i nomi delle directory devono terminare con la barra.

Il seguente script mostra come realizzare una interprete di comandi tipo CP/M o MS-DOS, nel quale, per coerenza con la sintassi di REBOL, i nomi dei file e delle directory devono iniziare con il simbolo del percento "%" e i nomi delle directory devono finire con la barra "/".


REBOL [
        Title: "Small DOS in REBOL"
        Purpose: "Show how to use various disk-related words"
        Date: 8-Dec-1999
        Author: "Daniele Forsi"
        Email: dforsi@montaperto.it
        Filename: %reboldos.r
        History: [
                3-Nov-1999 "First version"
                8-Dec-1999 "Full working"
        ]
]

reboldos: func [ /local result the-commands cmd cmd-block arg ] [

        the-commands: [
                "exit"  [ halt ]
                "dir"   [ if none? arg [ arg: "%./" ] list-dir load arg ]
                "cd"    [ either arg [ change-dir load arg ] [ print what-dir ] ]
                "md"    [ make-dir load arg ]
                "del"   [ delete load arg ]
                "type"  [ print read load arg ]
                "?"             [ cmd-block: [] foreach cmd the-commands [ if string? cmd [ insert cmd-block cmd ] ] print sort cmd-block ]
                "do"    [ do arg ]
        ]

        print "? = help"
        forever [
                parse/all
                        ask compose [ (what-dir) "> " ]
                        [ copy cmd to " " skip any " " copy arg to end | (arg: none) copy cmd to end ]

                if cmd [
                        if error? result: try [
                                switch/default cmd the-commands [ print [ "Unknown command" cmd ] ]
                                none ; for 'try
                        ] [ result: disarm result print [ "Error:" result/id ] ]
                ]
        ]
]

; start it

reboldos
;eof


Parole relative alla gestione dei files

change-dircambia la directory corrente
clean-pathtrasforma da relativo ad assoluto il nome di un file o di una directory
close chide una porta aperta
deletecancella un file o una cartella (se è vuota)
echocopia sul file specificato tutto quello che viene scritto sullo schermo; smette se si specifica "NONE" al posto del nome del file
exists?fornisce il valore "TRUE" se il file esiste, altrimenti fornisce il valore "FALSE"
info?da un argomento di tipo file! o url! crea un oggetto contenente la lunghezza, la data e il tipo (file o directory)
list-dirmostra il contenuto della directory corrente
loadlegge un file (o un URL o una stringa) e lo esegue
make-dircrea una nuova directory
modified?fornisce la data dell'ultima modifica di un file (quella fornita dal sistema operativo)
openapre una porta
query(presente, ma non funzionante nella versione attuale)
readlegge da una porta aperta
read-iolegge a basso livello da una porta aperta
renamecambia il nome di un file
savescrive un valore nel file specificato (opzionalmente con una intestazione)
script?controlla se il file specificato contiene l'intestazione di uno script (cioè REBOL [ ])
size?fornisce la lunghezza del file
split-pathcrea un blocco con due valori di tipo file! dividendo l'argomento fornito (il primo è il percorso, il secondo è il nome del file)
updateaggiorna le informazioni
what-dirfornisce il nome della directory corrente
writescrive su una porta aperta
write-ioscrive a basso livello su una porta aperta


<--Prev Index Next-->

Copyright AMiWoRLD