6.4 stat -- Interpretare i risultati di stat()

Il modulo stat definisce costanti e funzioni per interpretare i risultati di os.stat(), os.fstat() e os.lstat() (se esistono). Per dettagli più esaustivi sulle funzioni di sistema stat(), fstat() e lstat(), consultate la documentazione del vostro sistema.

Il modulo stat definisce le seguenti funzioni per fare verifiche su specifici tipi di file.

S_ISDIR( mode)
Restituisce un valore non zero se mode proviene da una directory.

S_ISCHR( mode)
Restituisce un valore non zero, se mode proviene da un file speciale che rappresenta un dipositivo con interfaccia a carattere.

S_ISBLK( mode)
Restituisce un valore non zero se mode proviene da un file speciale che rappresenta un dispositivo con interfaccia a blocchi.

S_ISREG( mode)
Restituisce un valore non zero se mode proviene da un file regolare.

S_ISFIFO( mode)
Restituisce un valore non zero se mode proviene da una FIFO (un canale ``pipe'' associato ad un nome).

S_ISLNK( mode)
Restituisce un valore non zero se mode proviene da un link simbolico.

S_ISSOCK( mode)
Restituisce un valore non zero se mode proviene da un socket.

Sono inoltre definite due funzioni che manipolano in modo più generale il ``modo'' del file:

S_IMODE( mode)
Restituisce quella parte del ``modo'' del file che può essere cambiata con os.chmod()--vale a dire, i bit dei permessi del file più il bit 'sticky', i bit di 'set-user-id' e di 'set-group-id' (per i sistemi che li supportano).

S_IFMT( mode)
Restituisce quella parte del ``modo'' del file che descrive il tipo di file (usato dalle funzioni S_IS*() di cui sopra).

Normalmente, si usano le le funzion os.path.is*() per verificare il tipo di file; le funzioni descritte in questa sezione sono utili quando si stanno facendo controlli multipli sullo stesso file e si vuole evitare il lavoro aggiuntivo che si otterrebbe dall'esecuzione di stat() per ogni singolo controllo. Queste funzioni sono anche utili quando si vogliono controllare le informazioni su file non gestiti da os.path, come ad esempio i file che rappresentano dispositivi con interfaccia a carattere o a blocchi.

Tutte le variabili elencate in seguito sono semplicemente indici simbolici nella decupla restituita da os.stat(), os.fstat() o os.lstat().

ST_MODE
Modo di protezione dell'inode.

ST_INO
Numero dell'inode.

ST_DEV
Dispositivo su cui risiede l'inode.

ST_NLINK
Numero di link che puntano all'inode.

ST_UID
Identificativo utente del proprietario.

ST_GID
Identificativo di gruppo del proprietario.

ST_SIZE
Per un file regolare, dimensione in byte; per alcun i tipi di file che rappresentano dispositivi, la quantità di dati in attesa.

ST_ATIME
Tempo dall'ultimo accesso.

ST_MTIME
Tempo dall'ultima modifica.

ST_CTIME
Il ``ctime'' come riportato dal Sistema Operativo. Su alcuni sistemi (simili a Unix) è il tempo trascorso dall'ultimo cambiamento dei metadati e, su altri sistemi (simili a Windows) rappresenta il tempo trascorso dalla creazione (vedete la documentazione della piattaforma che volete usare per i dettagli).

L'interpretazione del termine ``dimensione del file'' cambia a secondo del tipo di file. Per file di tipo regolare, rappresenta la dimensione effettiva in byte. Per FIFO e socket, in molte varianti di Unix (incluso ed in particolar modo Linux), la ``dimensione'' corrisponde al numero di byte in attesa di essere letti al momento in cui si è chiamato os.stat(), os.fstat(), oppure os.lstat(); questo può qualche volta essere utile, specialmente per interrogare periodicamente questi tipi di file speciali dopo averli aperti in modo non bloccante. Il significato del campo 'size', per altri file rappresentanti dispositivi a carattere e a blocchi, varia in misura maggiore e dipende molto dall'implementazione della funzione di sistema operativo sottostante.

Esempio:

import os, sys
from stat import *

def walktree(top, callback):
    '''discende ricorsivamente un albero di directory con radice in
       top, chiamando la funzione callback per ogni file di tipo
       regolare incontrato'''    

    for f in os.listdir(top):
        pathname = os.path.join(top, f)
        mode = os.stat(pathname)[ST_MODE]
        if S_ISDIR(mode):
            # E` una directory, va analizzata ricorsivamente
            walktree(pathname, callback)
        elif S_ISREG(mode):
            # E` un file, chiama la funzione callback
            callback(pathname)
        else:
            # E` un file di tipo sconosciuto, stampa un messaggio
            print 'Escludo %s' % pathname

def visitfile(file):
    print 'Sto analizzando ', file

if __name__ == '__main__':
    walktree(sys.argv[1], visitfile)
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.