it:informatica:linux:lettura_del_contenuto_di_una_directory_system_call_opendir_readdir_closedir_e_stat
Return to Home page

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
/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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki
Privacy Policy