Ottenere informazioni su un file in C può essere essenziale per capire la natura del file stesso e per gestire correttamente le operazioni di input/output (I/O). In C, la libreria standard fornisce funzioni che permettono di accedere a informazioni importanti sui file, come la loro dimensione, permessi, data di creazione e modifica, e altri attributi. Di seguito, esploreremo come ottenere questi dettagli con esempi pratici e spiegazioni.
Quando lavoriamo con i file, i metadati sono informazioni che descrivono il file stesso, come:
- Dimensione del file
- Tipo di file (ad esempio, file regolare o directory)
- Permessi di accesso (lettura, scrittura, esecuzione)
- Data di creazione, modifica, e accesso
- ID del proprietario e del gruppo
In C, la libreria standard e POSIX (su sistemi Unix-like) forniscono strumenti e funzioni per accedere a questi dati. Due delle funzioni più usate per ottenere informazioni sui file sono stat
e fstat
.
La funzione stat
è una delle funzioni più comuni per ottenere informazioni sui file. Si trova nella libreria <sys/stat.h>
ed è supportata su sistemi POSIX (come Linux e macOS). Questa funzione prende in input il percorso del file e riempie una struttura di tipo struct stat
con i metadati.
Ecco la sintassi della funzione stat
:
#include <sys/stat.h>
int stat(const char *pathname, struct stat *buf);
pathname
: percorso del file di cui si vogliono ottenere informazioni.buf
: puntatore a una strutturastat
che verrà riempita con le informazioni sul file.
Se la funzione ha successo, restituisce 0
. In caso di errore, restituisce -1
.
La struttura stat
contiene diversi campi che descrivono il file:
struct stat {
dev_t st_dev; /* ID del dispositivo contenente il file */
ino_t st_ino; /* Numero dell'inode */
mode_t st_mode; /* Tipo di file e permessi */
nlink_t st_nlink; /* Numero di link */
uid_t st_uid; /* ID dell'utente proprietario */
gid_t st_gid; /* ID del gruppo proprietario */
dev_t st_rdev; /* Tipo di dispositivo (se è un dispositivo speciale) */
off_t st_size; /* Dimensione totale, in byte */
blksize_t st_blksize; /* Dimensione del blocco di I/O */
blkcnt_t st_blocks; /* Numero di blocchi allocati */
time_t st_atime; /* Tempo dell'ultimo accesso */
time_t st_mtime; /* Tempo dell'ultima modifica */
time_t st_ctime; /* Tempo dell'ultimo cambio di stato */
};
Vediamo un esempio di codice in cui usiamo stat
per ottenere informazioni su un file e stamparle.
#include <stdio.h>
#include <sys/stat.h>
#include <time.h>
int main() {
struct stat fileStat;
// Percorso del file di cui ottenere le informazioni
if (stat("file.txt", &fileStat) < 0) {
perror("Errore nell'ottenere informazioni sul file");
return 1;
}
printf("Dimensione del file: %lld bytes\n", (long long) fileStat.st_size);
printf("Ultimo accesso: %s", ctime(&fileStat.st_atime));
printf("Ultima modifica: %s", ctime(&fileStat.st_mtime));
printf("Permessi: %o\n", fileStat.st_mode & 0777);
printf("Numero di link: %ld\n", (long) fileStat.st_nlink);
return 0;
}
Questo programma:
- Usa
stat
per ottenere le informazioni su un file chiamatofile.txt
. - Stampa la dimensione del file, il tempo dell'ultimo accesso e dell'ultima modifica.
- Stampa i permessi e il numero di link.
Il campo st_mode
contiene i permessi del file codificati in un valore ottale. Per interpretare questi permessi, possiamo fare un'operazione bitwise e con 0777
, ottenendo i permessi in formato rwxrwxrwx
, dove:
r
indica la possibilità di lettura (read),w
la possibilità di scrittura (write),x
la possibilità di esecuzione (execute).
fstat
è simile a stat
, ma prende in input un file descriptor anziché un percorso di file. È utile se il file è già stato aperto con open
. La sintassi è:
#include <sys/stat.h>
int fstat(int fd, struct stat *buf);
lstat
è simile a stat
, ma non segue i collegamenti simbolici. Se si usa stat
su un collegamento simbolico, verranno fornite le informazioni sul file a cui punta il collegamento. Con lstat
, invece, si ottengono le informazioni sul collegamento stesso.
Conclusione
In C, ottenere informazioni su un file è abbastanza semplice grazie alle funzioni stat
, fstat
, e lstat
. Queste funzioni permettono di accedere a dettagli importanti sui file, come dimensione, permessi, e tempi di modifica, che possono essere utili per prendere decisioni sulle operazioni I/O.