Obtener tamaño de archivo en C
-
Utilice la función
stat
para obtener el tamaño del archivo en C -
Utilice la función
fstat
para obtener el tamaño del 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);
}
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