Obtenha o tamanho do arquivo em C

Jinku Hu 12 outubro 2023
  1. Use a função stat para obter o tamanho do arquivo em C
  2. Use a função fstat para obter o tamanho do arquivo em C
Obtenha 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);
}
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

Artigo relacionado - C File