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:
pathlistUn vettore di nomi-file. Sono usati i valori dei singoli elementi; gli indici che puntano a tali valori vengono ignorati.
flagsQuesto 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_LOGICALPassa 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_PHYSICALPassa 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_NOCHDIRPer migliorare le prestazioni, la routine di libreria C fts()
cambia directory mentre percorre una gerarchia di file. Questo flag
disabilita quell’ottimizzazione.
FTS_COMFOLLOWSi accede al file puntato da un collegamento simbolico esistente in pathlist,
anche se FTS_LOGICAL non è stato impostato.
FTS_SEEDOTPer 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_XDEVMentre si percorre un filesystem, non passare mai a un filesystem montato diverso da quello in cui si opera.
filedataIl 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égawkgià 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]