Obtenir la taille du fichier en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction stat pour obtenir la taille du fichier en C
  2. Utilisez la fonction fstat pour obtenir la taille du fichier en C
Obtenir la taille du fichier en C

Cet article explique plusieurs méthodes pour obtenir la taille des fichiers en C.

Utiliser la fonction stat pour obtenir la taille du fichier en C

L’appel système stat est la fonction conforme à POSIX qui peut être utilisée pour récupérer divers attributs du fichier donné. Elle prend deux arguments - le premier est le pointeur char qui doit pointer vers le nom du fichier, et le second argument est de type pointeur struct stat qui est décrit en détail dans la fonction manual. Une fois que l’appel à la fonction est renvoyé avec succès, l’utilisateur peut extraire les attributs nécessaires du fichier à partir de la struct stat en accédant directement à ses membres. La taille du fichier est stockée dans le membre st_size de la structure. Notez que la fonction stat ne nécessite pas de permission sur le fichier pour récupérer les attributs, mais l’appelant doit avoir exécuté la permission sur chaque répertoire inclus dans le nom du chemin.

#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);
}

Production :

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

Le membre st_size représente la taille totale du fichier en octets. Dans le cas où le nom de chemin donné est le lien symbolique, ce membre indique la longueur du pointeur du nom de chemin par le lien. Nous mettons en œuvre un exemple qui prend le nom de fichier à partir de la valeur de la chaîne de caractères hardcoded déclarée const dans l’échantillon de code ci-dessus, bien que l’utilisateur puisse passer le nom de fichier comme paramètre du programme comme démontré dans l’exemple suivant. L’appel stat renvoie -1 en cas d’échec et errno est défini en conséquence ; sinon, zéro est renvoyé pour indiquer le succès.

#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);
}

Utilisez la fonction fstat pour obtenir la taille du fichier en C

On peut aussi utiliser la fonction fstat, qui prend le descripteur de fichier comme premier argument pour spécifier le fichier cible. Le descripteur de fichier peut être obtenu par l’appel système open, mais assurez-vous de fermer les fichiers ouverts lorsqu’ils ne sont pas nécessaires en utilisant l’appel système close. Notez que tous les exemples de cet article affichent la plupart des membres de struct stat. Vous pourriez avoir besoin d’extraire les informations pertinentes sur les attributs en utilisant les fonctions supplémentaires, par exemple st_mode et 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);
}
Auteur: 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

Article connexe - C File