Obtenha o tamanho do arquivo em C
-
Use a função
stat
para obter o tamanho do arquivo em C -
Use a função
fstat
para obter o tamanho do arquivo em C
Este artigo irá explicar vários métodos de como obter o tamanho do arquivo em C.
Use a função stat
para obter o tamanho do arquivo em C
A chamada de sistema stat
é a função compatível com POSIX que pode ser usada para recuperar vários atributos de um arquivo fornecido. Leva dois argumentos - o primeiro dos quais é o ponteiro char
que deve apontar para o caminho do arquivo, e o segundo argumento é do tipo ponteiro struct stat
que é descrito extensivamente na função manual. Uma vez que a chamada de função retorna com sucesso, o usuário pode extrair os atributos necessários do arquivo do struct stat
acessando seus membros diretamente. O tamanho do arquivo é armazenado no membro st_size
da estrutura. Observe que a função stat
não requer permissões no arquivo para recuperar os atributos, mas o chamador deve ter executado a permissão em todos os diretórios incluídos no nome do caminho.
#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);
}
Resultado:
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
O membro st_size
representa o tamanho total do arquivo em bytes. No caso do nome do caminho fornecido ser o link simbólico, este membro denota o comprimento do ponteiro do nome do caminho pelo link. Implementamos um exemplo que obtém o nome do arquivo do valor de string codificado permanentemente declarado const
no exemplo de código acima, embora o usuário possa passar o nome do arquivo como o parâmetro do programa, conforme demonstrado no exemplo a seguir. A chamada stat
retorna -1
em caso de falha e errno
é definido de acordo; caso contrário, zero é retornado para denotar o sucesso.
#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);
}
Use a função fstat
para obter o tamanho do arquivo em C
Alternativamente, podemos usar a função fstat
, que leva o descritor do arquivo como o primeiro argumento para especificar o arquivo de destino. O descritor de arquivo pode ser obtido pela chamada de sistema open
, mas certifique-se de fechar os arquivos abertos quando eles não forem necessários usando a chamada de sistema close
. Observe que todos os exemplos neste artigo imprimem a maioria dos membros struct stat
. Pode ser necessário extrair as informações relevantes sobre os atributos usando as funções adicionais, por exemplo, 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);
}
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