Torna all'elenco delle lezioni La gestione dei file locali e remoti

di Daniele Forsi versione 2.0 del 30 gennaio 2000

Indice

Il tipo "file"
I comandi "DOS"
Esempio: Small DOS in REBOL
Parole relative alla gestione dei files

Il tipo "file" [Indice di questa lezione]

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" [Indice di questa lezione]

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.

Esempio: Small DOS in REBOL [Indice di questa lezione]

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 file-related words. Can be used with any file or URL
         (ftp, http, dns, and so on.}
    Comment: "With 'do this script has access to the full power of REBOL"
    Date: 30-Jan-2000
    Author: "Daniele Forsi"
    Email: dforsi@montaperto.it
    Filename: %reboldos.r
    History: [
        3-Nov-1999 "First version"
        8-Dec-1999 "Full working"
        16-Dec-1999 "Added do"
        30-Jan-2000 "Added print to exit command"
    ]
]

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

    the-commands: [
        "exit"    [ print {type "reboldos" to restart} 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: copy [] foreach cmd the-commands [ if string? cmd [ insert cmd-block cmd ] ] print sort cmd-block ]
        "do"    [ do load 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 [Indice di questa lezione]

change-dir cambia la directory corrente
clean-path trasforma da relativo ad assoluto il nome di un file o di una directory
close chiude 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 valore del blocco creato è 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


Per commenti su questa pagina o se vuoi collaborare scrivi a Daniele Forsi