Successivo: Esempio di estensione Fnmatch, Su: Esempi di estensione [Contenuti][Indice]
L’estensione filefuncs
include tre funzioni diverse, come descritto sotto.
L’uso è il seguente:
@load "filefuncs"
Questo è il modo per caricare l’estensione.
risultato = chdir("/qualche/directory")
La funzione chdir()
invoca a sua volta la chiamata di sistema
chdir()
per cambiare la directory corrente. Restituisce zero
se tutto va bene o un valore minore di zero in caso di errore.
In quest’ultimo caso, viene aggiornata la variabile ERRNO
.
risultato = stat("/qualche/percorso", statdata
[, follow
])
La funzione stat()
invoca a sua volta la chiamata di sistema
stat()
.
Restituisce zero se tutto va bene o un valore minore di zero in caso di
errore.
In quest’ultimo caso, viene aggiornata la variabile ERRNO
.
Per default, viene usata la chiamata di sistema lstat()
.
Tuttavia, se alla funzione viene passato un terzo argomento, questa invoca
invece stat()
.
In tutti i casi, il vettore statdata
viene preventivamente svuotato.
Quando la chiamata a stat()
riesce, viene riempito il vettore
statdata
con le informazioni ottenute dal fileystem, come segue:
Indice | Campo in struct stat | Tipo file |
---|---|---|
"name" | Il nome-file | Tutti |
"dev" | st_dev | Tutti |
"ino" | st_ino | Tutti |
"mode" | st_mode | Tutti |
"nlink" | st_nlink | Tutti |
"uid" | st_uid | Tutti |
"gid" | st_gid | Tutti |
"size" | st_size | Tutti |
"atime" | st_atime | Tutti |
"mtime" | st_mtime | Tutti |
"ctime" | st_ctime | Tutti |
"rdev" | st_rdev | Dispositivi |
"major" | st_major | Dispositivi |
"minor" | st_minor | Dispositivi |
"blksize" | st_blksize | Tutti |
"pmode" | Una versione leggibile del valore dell’autorizzazione,
come quello stampato dal comando
ls (per esempio, "-rwxr-xr-x" ) | Tutti |
"linkval" | Il valore del collegamento simbolico | Collegamenti simbolici |
"type" | Il tipo del file in formato stringa — può essere
"file" ,
"blockdev" ,
"chardev" ,
"directory" ,
"socket" ,
"fifo" ,
"symlink" ,
"door"
o
"unknown"
(non tutti i sistemi supportano tutti i tipi file) | Tutti |
flags = or(FTS_PHYSICAL, ...)
risultato = fts(pathlist, flags, filedata)
Percorre gli alberi di file elencati in pathlist
e riempie il vettore
filedata
, come descritto qui di seguito. flags
è l’operazione
OR bit a bit di parecchi valori predefiniti, pure descritti
più sotto.
Restituisce zero in assenza di errori, in caso contrario restituisce -1.
La funzione fts()
invoca a sua volta la routine di libreria C
fts()
per percorrere gerarchie di file. Invece di restituire i dati
relativi ai file uno per volta in sequenza,
riempie un vettore multidimensionale con i dati di ogni file e directory
che risiedono nelle gerarchie richieste.
Gli argomenti sono i seguenti:
pathlist
Un vettore di nomi-file. Sono usati i valori dei singoli elementi; gli indici che puntano a tali valori vengono ignorati.
flags
Questo dovrebbe essere l’OR bit a bit di uno o più dei
seguenti valori dei flag costanti predefiniti.
Almeno uno dei due flag FTS_LOGICAL
o FTS_PHYSICAL
dev’essere impostato; in caso contrario
fts()
restituisce una segnalazione di errore e imposta ERRNO
.
I flag sono:
FTS_LOGICAL
Passa in rassegna i file in modo “logico”, e quindi l’informazione restituita
per un collegamento simbolico è quella relativa al file puntato, e non al
collegamento simbolico stesso. Questo flag è mutuamente esclusivo con
FTS_PHYSICAL
.
FTS_PHYSICAL
Passa in rassegna i file in modo “fisico”, e quindi l’informazione restituita
per un collegamento simbolico è quella relativa al collegamento simbolico
stesso. Questo flag è mutuamente esclusivo con FTS_LOGICAL
.
FTS_NOCHDIR
Per migliorare le prestazioni, la routine di libreria C fts()
cambia directory mentre percorre una gerarchia di file. Questo flag
disabilita quell’ottimizzazione.
FTS_COMFOLLOW
Si accede al file puntato da un collegamento simbolico esistente in pathlist
,
anche se FTS_LOGICAL
non è stato impostato.
FTS_SEEDOT
Per default, la routine di libreria C fts()
non restituisce
informazioni per i file
"." (punto) e ".." (punto-punto). Quest’opzione richiede
l’informazione anche per "..". (L’estensione ritorna sempre
l’informazione per "."; maggiori dettagli più sotto.)
FTS_XDEV
Mentre si percorre un filesystem, non passare mai a un filesystem montato diverso da quello in cui si opera.
filedata
Il vettore filedata
contiene i risultati.
La funzione fts()
lo svuota all’inizio. In seguito viene creato
un elemento in filedata
per ogni elemento in pathlist
.
L’indice è il nome della directory o del file specificato in pathlist
.
L’elemento puntato da questo indice è a sua volta un vettore. Ci sono due
casi:
In questo caso, il vettore contiene due o tre elementi:
"path"
Il percorso completo di questo file, a partire dalla directory radice (“root”)
indicata nel vettore pathlist
.
"stat"
Questo elemento è esso stesso un vettore, contenente le stesse informazioni
fornite dalla funzione stat()
vista in precedenza a proposito del suo
argomento
statdata
. L’elemento può non essere presente se la chiamata
di sistema stat()
per il file non è riuscita.
"error"
Se qualche tipo di errore si verifica durante l’elaborazione, il vettore
conterrà anche un elemento con chiave "error"
, che è una stringa
che descrive l’errore.
In questo caso, nel vettore viene creato un elemento per ogni elemento
contenuto nella directory. Se un elemento della directory è un
file, l’azione del programma è la stessa descritta sopra per un file.
Se invece la directory contiene delle sottodirectory, l’elemento creato
nel vettore è (ricorsivamente) a sua volta un vettore che descrive la
sottodirectory. Se fra i flag è stato
specificato il flag FTS_SEEDOT
,
ci sarà anche un elemento di nome
".."
. Questo elemento sarà un vettore contenente i dati restituiti
da un’invocazione di stat()
.
Inoltre, ci sarà un elemento il cui indice è "."
.
Questo elemento è un vettore contenente gli stessi due o tre elementi che
sono messi a disposizione per un file: "path"
, "stat"
,
ed "error"
.
La funzione fts()
restituisce zero in assenza di errori.
in caso contrario, restituisce -1.
NOTA: L’estensione
fts()
non imita esattamente l’interfaccia fornita dalla routine di libreria Cfts()
, ma sceglie di fornire un’interfaccia basata sui vettori associativi, che è più adeguata per l’uso da parte di un programmaawk
. Questo implica la mancanza di una funzione di confronto, poichégawk
già prevede la possibilità di mettere facilmente nell’ordine desiderato gli elementi di un vettore. Anche se un’interfaccia modellata sufts_read()
avrebbe potuto essere fornita, è sembrato più naturale mettere a disposizione un vettore multidimensionale, che rappresenta la gerarchia dei file e le informazioni relative a ognuno di essi.
Si veda il file test/fts.awk nella distribuzione di gawk
per un esempio di uso dell’estensione fts()
.
Successivo: Esempio di estensione Fnmatch, Su: Esempi di estensione [Contenuti][Indice]