Action disabled: source
it:informatica:linux:lettura_del_contenuto_di_una_directory_system_call_opendir_readdir_closedir_e_stat
Return to Home page
If you found any error, or if you want to partecipate to the editing of this wiki, please contact: admin [at] skenz.it
You can reuse, distribute or modify the content of this page, but you must cite in any document (or webpage) this url: https://www.skenz.it/it/informatica/linux/lettura_del_contenuto_di_una_directory_system_call_opendir_readdir_closedir_e_stat?do=edit
Lettura del contenuto di una directory (system call opendir, readdir, closedir e stat)
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:
- 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.
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:
- lettura_contenuto_directory.c
/* 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); }
If you found any error, or if you want to partecipate to the editing of this wiki, please contact: admin [at] skenz.it
You can reuse, distribute or modify the content of this page, but you must cite in any document (or webpage) this url: https://www.skenz.it/it/informatica/linux/lettura_del_contenuto_di_una_directory_system_call_opendir_readdir_closedir_e_stat?do=edit
/web/htdocs/www.skenz.it/home/data/pages/it/informatica/linux/lettura_del_contenuto_di_una_directory_system_call_opendir_readdir_closedir_e_stat.txt · Last modified: 2024/04/08 22:35 by 127.0.0.1