![]() | 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-dir | come unico argomento vuole il nome della nuova directory |
delete | come unico argomento vuole il nome di un file o di una directory vuota |
list-dir | se si fornisce il nome di una directory ne mostra il contenuto, altrimenti mostra il contenuto di quella corrente |
make-dir | come unico argomento vuole il nome della directory da creare |
rename | vuole due argomenti: il primo è il vecchio nome, il secondo è il nuovo nome |
what-dir | non 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-dir | cambia la directory corrente |
clean-path | trasforma da relativo ad assoluto il nome di un file o di una directory |
close | chide una porta aperta |
delete | cancella un file o una cartella (se è vuota) |
echo | copia 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-dir | mostra il contenuto della directory corrente |
load | legge un file (o un URL o una stringa) e lo esegue |
make-dir | crea una nuova directory |
modified? | fornisce la data dell'ultima modifica di un file (quella fornita dal sistema operativo) |
open | apre una porta |
query | (presente, ma non funzionante nella versione attuale) |
read | legge da una porta aperta |
read-io | legge a basso livello da una porta aperta |
rename | cambia il nome di un file |
save | scrive 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-path | crea un blocco con due valori di tipo file! dividendo l'argomento fornito (il primo è il percorso, il secondo è il nome del file) |
update | aggiorna le informazioni |
what-dir | fornisce il nome della directory corrente |
write | scrive su una porta aperta |
write-io | scrive a basso livello su una porta aperta |
<--Prev | Index | Next--> |