Ottieni la dimensione del file in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione stat per ottenere la dimensione del file in C
  2. Usa la funzione fstat per ottenere la dimensione del file in C
Ottieni la dimensione del file in C

Questo articolo spiegherà diversi metodi su come ottenere la dimensione del file in C.

Usa la funzione stat per ottenere la dimensione del file in C

La chiamata di sistema stat è la funzione conforme a POSIX che può essere usata per recuperare vari attributi del file dato. Richiede due argomenti - il primo dei quali è il puntatore char che dovrebbe puntare al percorso del file, e il secondo argomento è di tipo puntatore struct stat che è ampiamente descritto nella funzione manuale. Una volta che la chiamata alla funzione ritorna con successo, l’utente può estrarre gli attributi necessari del file dalla struct stat accedendo direttamente ai suoi membri. La dimensione del file è memorizzata nel membro st_size della struttura. Notare che, la funzione stat non richiede i permessi sul file per recuperare gli attributi, ma il chiamante dovrebbe aver eseguito i permessi su ogni directory inclusa nel percorso.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>

const char *filename = "input.txt";

int main(int argc, char *argv[]) {
  struct stat sb;

  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  printf("Inode number: %lu\n", sb.st_ino);
  printf("User ID of owner: %u\n", sb.st_uid);
  printf("Group ID of owner: %u\n", sb.st_gid);
  printf("Total file size: %lu bytes\n", sb.st_size);
  printf("Last status change:       %s", ctime(&sb.st_ctime));
  printf("Last file access:         %s", ctime(&sb.st_atime));
  printf("Last file modification:   %s", ctime(&sb.st_mtime));

  exit(EXIT_SUCCESS);
}

Produzione:

Inode number: 12638061
User ID of owner: 1000
Group ID of owner: 1000
Total file size: 126 bytes
Last status change:       Sat Feb  6 23:35:02 2021
Last file access:         Sat Feb  6 23:35:02 2021
Last file modification:   Sat Feb  6 23:35:02 2021

Il membro st_size rappresenta la dimensione totale del file in byte. Nel caso in cui il percorso specificato sia il collegamento simbolico, questo membro denota la lunghezza del puntatore del percorso tramite il collegamento. Implementiamo un esempio che prende il nome del file dal valore di stringa hardcoded dichiarato const nell’esempio di codice precedente, sebbene l’utente possa passare il nome del file come parametro del programma come mostrato nell’esempio seguente. La chiamata stat restituisce -1 in caso di fallimento e errno è impostato di conseguenza; altrimenti viene restituito zero per denotare il successo.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>

int main(int argc, char *argv[]) {
  struct stat sb;
  char *filename = NULL;

  if (argc != 2) {
    printf("Usage: ./program filename\n");
    exit(EXIT_FAILURE);
  }

  filename = argv[1];

  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  printf("Inode number: %lu\n", sb.st_ino);
  printf("User ID of owner: %u\n", sb.st_uid);
  printf("Group ID of owner: %u\n", sb.st_gid);
  printf("Total file size: %lu bytes\n", sb.st_size);
  printf("Last status change:       %s", ctime(&sb.st_ctime));
  printf("Last file access:         %s", ctime(&sb.st_atime));
  printf("Last file modification:   %s", ctime(&sb.st_mtime));

  exit(EXIT_SUCCESS);
}

Usa la funzione fstat per ottenere la dimensione del file in C

In alternativa, possiamo usare la funzione fstat, che prende il descrittore di file come primo argomento per specificare il file di destinazione. Il descrittore di file può essere acquisito tramite la chiamata di sistema open, ma assicurati di chiudere i file aperti quando non sono necessari usando la chiamata di sistema close. Si noti che tutti gli esempi in questo articolo stampano la maggior parte dei membri struct stat. Potrebbe essere necessario estrarre le informazioni pertinenti sugli attributi utilizzando le funzioni aggiuntive, ad esempio st_mode e st_dev.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>

const char *filename = "input.txt";

int main(int argc, char *argv[]) {
  struct stat sb;

  int fd = open(filename, O_RDONLY);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  if (fstat(fd, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  printf("Inode number: %lu\n", sb.st_ino);
  printf("User ID of owner: %u\n", sb.st_uid);
  printf("Group ID of owner: %u\n", sb.st_gid);
  printf("Total file size: %lu bytes\n", sb.st_size);
  printf("Last status change:       %s", ctime(&sb.st_ctime));
  printf("Last file access:         %s", ctime(&sb.st_atime));
  printf("Last file modification:   %s", ctime(&sb.st_mtime));

  close(fd);

  exit(EXIT_SUCCESS);
}
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C File