Obtener tamaño de archivo en C

Jinku Hu 12 octubre 2023
  1. Utilice la función stat para obtener el tamaño del archivo en C
  2. Utilice la función fstat para obtener el tamaño del archivo en C
Obtener tamaño de archivo en C

Este artículo explicará varios métodos de cómo obtener el tamaño del archivo en C.

Utilice la función stat para obtener el tamaño del archivo en C

La llamada al sistema stat es la función compatible con POSIX que se puede utilizar para recuperar varios atributos del archivo dado. Se necesitan dos argumentos: el primero de los cuales es el puntero char que debe apuntar al nombre de la ruta del archivo, y el segundo argumento es del tipo struct stat puntero que se describe ampliamente en la función manual. Una vez que la llamada a la función regresa con éxito, el usuario puede extraer los atributos necesarios del archivo de la estructura struct stat accediendo a sus miembros directamente. El tamaño del archivo se almacena en el miembro st_size de la estructura. Tenga en cuenta que la función stat no requiere permisos en el archivo para recuperar los atributos, pero la persona que llama debería haber ejecutado el permiso en cada directorio incluido en el nombre de la ruta.

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

Producción :

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

El miembro st_size representa el tamaño total del archivo en bytes. En caso de que el nombre de ruta dado sea el enlace simbólico, este miembro indica la longitud del puntero del nombre de ruta por el enlace. Implementamos un ejemplo que toma el nombre del archivo del valor de cadena codificado const declarado en el ejemplo de código anterior, aunque el usuario puede pasar el nombre del archivo como parámetro del programa como se demuestra en el siguiente ejemplo. La llamada stat devuelve -1 en caso de fallo y errno se establece en consecuencia; de lo contrario, se devuelve cero para indicar el éxito.

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

Utilice la función fstat para obtener el tamaño del archivo en C

Alternativamente, podemos usar la función fstat, que toma el descriptor de archivo como primer argumento para especificar el archivo de destino. El descriptor de archivo puede adquirirse mediante la llamada al sistema open, pero asegúrese de cerrar los archivos abiertos cuando no sean necesarios mediante la llamada al sistema close. Observe que todos los ejemplos de este artículo imprimen la mayoría de los miembros de struct stat. Es posible que deba extraer la información relevante sobre los atributos utilizando funciones adicionales, por ejemplo, st_mode y 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);
}
Autor: 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

Artículo relacionado - C File