Concetti:
System call per la lettura del contenuto di una directory (opendir, readdir e closedir) e per la stampa di informazioni relative ai file (stat).
Testo:
Realizzare un programma per leggere il contenuto di una directory e stamparne alcune informazioni. Il nome della directory è l'unico parametro del programma.
Il programma dovrà stampare:
FILE: <nome_file> <dimensione_file_in_byte>
DIR: <nome_dir>
Le due directory speciali “.” (directory attuale) e “..” (directory padre) non devono essere analizzate.
Esempio:
> ./prog dir FILE: dir/file1 50 FILE: dir/file2 6 DIR: dir/dir2 DIR: dir/dir1 DIR: dir/dir3
Nella cartella dir
sono presenti due file (file1
e file2
) e tre directory (dir1
, dir2
e dir3
). Le dimensioni dei file file1
e file2
sono rispettivamente 50 e 6 byte.
Soluzione:
/* Realizzare un programma per leggere il contenuto di una directory e stamparne alcune informazioni. Il nome della directory e' l'unico parametro del programma. Il programma dovra' stampare: - per ogni file contenuto nella directory il nome del file e la sua dimensione in byte con il seguente formato: FILE: <nome_file> <dimensione_file_in_byte> - per tutte le sottodirectory il nome delle sottodirectory con il seguente formato: DIR: <nome_dir> Le due directory speciali "." (directory attuale) e ".." (directory padre) non devono essere analizzate. */ #include <sys/types.h> /* opendir, stat */ #include <dirent.h> /* opendir */ #include <sys/stat.h> /* stat */ #include <unistd.h> /* stat */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 100 int main (int argc, char *argv[]) { DIR *dp; struct stat statbuf; struct dirent *dirp; char name[N], *dirName; if (argc != 2) { fprintf(stderr, "Utilizzo: %s <pathname>\n", argv[0]); exit(1); } /* Apertura directory */ dirName = argv[1]; if ( (dp = opendir(dirName)) == NULL) { fprintf(stderr, "Errore apertura directory: %s\n", argv[1]); exit(1); } /* Ciclo sugli elementi contenuti nella directory */ while ( (dirp = readdir(dp)) != NULL) { /* path di un elemento contenuto nella directory */ sprintf (name, "%s/%s", dirName, dirp->d_name); /* Se l'elemento non e' una directory speciale ("." o "..") */ if (strcmp(dirp->d_name, ".") != 0 && strcmp(dirp->d_name, "..") != 0) { /* Analizzo l'elemento name */ if (stat(name, &statbuf) < 0 ) { fprintf (stderr, "Errore di esecuzione stat\n"); exit (1); } if (S_ISDIR(statbuf.st_mode)) { /* Se e' una directory */ printf("DIR: %s\n", name); } else if (S_ISREG(statbuf.st_mode)) { /* Se e' un file */ printf("FILE: %s %ld\n", name, (long)statbuf.st_size); } } } /* Chiusura della directory */ if (closedir(dp) < 0) { fprintf (stderr, "Errore chiusura directory\n"); exit (1); } return (0); }