Successivo: , Su: Esempi di estensione   [Contenuti][Indice]


17.7.1 Funzioni relative ai file

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:

IndiceCampo in struct statTipo file
"name"Il nome-fileTutti
"dev"st_devTutti
"ino"st_inoTutti
"mode"st_modeTutti
"nlink"st_nlinkTutti
"uid"st_uidTutti
"gid"st_gidTutti
"size"st_sizeTutti
"atime"st_atimeTutti
"mtime"st_mtimeTutti
"ctime"st_ctimeTutti
"rdev"st_rdevDispositivi
"major"st_majorDispositivi
"minor"st_minorDispositivi
"blksize"st_blksizeTutti
"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 simbolicoCollegamenti 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:

Il percorso è un file

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.

Il percorso è una directory

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 C fts(), ma sceglie di fornire un’interfaccia basata sui vettori associativi, che è più adeguata per l’uso da parte di un programma awk. 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 su fts_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: , Su: Esempi di estensione   [Contenuti][Indice]