Obter informações de disco (espaço livre e ocupado) é uma das coisas mais comuns a todos os usuários de computadores e sistemas computacionais (smartphones e tablets, por exemplo). Porém, as vezes é necessário obter tais informações “programaticamente”, ou seja, um programa pode precisar requisitar este tipo de informação ao Sistema Operacional. As finalidades desse tipo de informação são diversas, como por exemplo: por puro conhecimento do espaço livre e usado em disco (para exibição ao usuário), telemetria de informações de disco via Internet ou rede local, saber se algum determinado recurso pode ser instalado considerando o espaço livre em disco, etc.
Este artigo, no formato de dicas e truques, mostrará uma forma de se obter informações do disco (incluindo espaço livre e ocupado em disco) programaticamente em C, considerando como sistema operacional o Linux.
A API statvfs
A API statvfs tem como finalidade permitir que sejam obtidas diversas informações de disco livre e/ou ocupado. Nativamente presente no Linux, esta API pode ser utilizada em C.
Por se tratar de algo nativo, significa que um programa que faz uso dela pode ser compilado, em teoria, em qualquer distribuição Linux, algo muito valioso visando distribuição e uso em massa de um programa.
O uso da statvfs
O uso da statvfs é simples. Primeiramente, seu programa deve incluir o header file sys/statvfs.h, conforme mostrado abaixo:
#include <sys/statvfs.h>
E há apenas uma função a ser utilizada, a própria statvfs. O protótipo da função ststvfs está abaixo:
int statvfs(const char *path, struct statvfs *buf);
Onde os parâmetros significam:
- const char *path: ponteiro para um array de char contendo o caminho/path do disco das quais serão obtidas as informações;
- struct statvfs *buf: ponteiro para uma estrutura do tipo statvfs, a qual conterá todas as informações disponíveis pela API após a execução da função.
A estrutura statvfs possui em seus elementos todas as informações possíveis de serem obtidas com a API. Na figura 1 estão presentes as informações (nome dos elementos da estrutura) e o que significam.

IMPORTANTE: os tipos fsblkcnt_t e fsfilcnt_t são equivalentes a unsigned long.
Código-fonte – exemplo
Abaixo segue um código-fonte que exemplifica o uso da statvfs:
#include <stdio.h>
#include <stdlib.h>
#include <sys/statvfs.h>
//define com valor (em bytes) de 1 GB.
//A utilidade deste é deixar os cálculos mais
//legíveis e compreensíveis no código.
#define VAL_GB (1024*1024*1024)
#define ERRO_STATVFS -1
//programa principal
int main (int argc, char *argv[])
{
struct statvfs buf;
float DiscoLivre;
float PorcentagemDiscoOcupado;
float DiscoTotal;
char PathArray[100];
//compoe o path (no caso, um drive montado em /mnt)
sprintf(PathArray,"/mnt");
if (statvfs(PathArray, &buf) == ERRO_STATVFS)
{
printf("\n\rErro ao obter informacoes do path %s. O programa sera finalizado.\n\n",PathArray);
return 0;
}
DiscoLivre = ( (float)buf.f_bavail * buf.f_bsize) / VAL_GB;
DiscoTotal = ( (float)buf.f_blocks * buf.f_bsize) / VAL_GB;
PorcentagemDiscoOcupado = 100.0*(1 - (DiscoLivre / DiscoTotal));
//Escreve na tela o espaco livre, espaço total em disco e porcentagem
//de disco ocupado e o programa é finalizado.
printf("\n\rDisco livre: %.1fGB\n", DiscoLivre);
printf("\n\rEspaco total: %.1fGB\n", DiscoTotal);
printf("\n\rPorcentagem de disco ocupado: %.1f %% \n", PorcentagemDiscoOcupado);
return 0;
}
Cole o código-fonte em um editor de sua escolha e salve o arquivo como InfoDiscos.c. Para fazer a compilação, nenhuma biblioteca em especial é necessária, portanto a copilação pode ser feita da seguinte maneira:
gcc InfoDiscos.c -o InfoDiscos
E a execução é feita conforme abaixo:
./InfoDiscos
Indo além – Telemetria de uso de disco pela Internet
Uma coisa que fiz em um servidor de arquivos que montei na minha casa (saiba mais lendo este artigo) foi monitorar pela Internet a porcentagem de disco ocupada do servidor, assim como o espaço ocupado. Isso foi feito utilizando a própria statvfs e uma biblioteca de minha autoria chamada ThingSpeakC. Isso me permite, de qualquer lugar do mundo com conexão à Internet, saber estas informações do meu servidor, de modo que eu consiga tomar decisão de buscar por mais espaço ou não. Além disso, um histórico destas informações fica gravado no próprio ThingSpeak, permitindo saber inclusive quando e como as medições variaram.
Portanto, aplicações simples e úteis podem ser feitas da mesma forma, utilizando plataformas Cloud como o ThingSpeak ou similares. Se quiser um exemplo de projeto usando esta “arquitetura”, veja aqui.
Saiba mais
Servidor de arquivos Nextcloud na Orange PI PC Plus H3
Enviando temperatura dos núcleos da Raspberry Pi 3 para o ThingSpeak em C
Referências






