Ir para o conteúdo

Última atualização:2026-10-12

C++17 e SQLite para medir o tamanho de diretórios

Projeto prático: cálculo e armazenamento do tamanho de pastas com C++17 e SQLite

Esta seção gira em torno de um cenário de projeto: suponha que o negócio precise verificar periodicamente o tamanho de certas pastas e fazer uma operação de persistência — como o C++ pode realizar esse projeto?

Nesta seção, por meio de um projeto pequeno, você implementa com C++17 e SQLite um sistema de cálculo e armazenamento do tamanho de pastas, ajudando-o a gerenciar melhor o seu sistema de arquivos.

Objetivo do projeto

Implementaremos as seguintes funcionalidades: 1. Calcular recursivamente o tamanho do diretório especificado e de seus subdiretórios. 2. Salvar o resultado do cálculo em um banco de dados SQLite, facilitando consultas e análises posteriores. 3. Alta extensibilidade: você pode modificar o projeto com facilidade, adicionando suporte multi-thread, otimizando o desempenho ou armazenando os resultados em outro banco de dados.

Nota: versão para preguiçosos, o código completo já foi publicado na planeta.

Etapas de implementação do projeto

1. Ambiente

Primeiro, você precisa garantir que as seguintes ferramentas estejam instaladas no ambiente de desenvolvimento: - Compilador com suporte a C++17: como o g++, cuja versão pode ser verificada com o comando a seguir:

g++ --version
Certifique-se de que o g++ dá suporte ao padrão C++17.

  • SQLite3: para as operações de banco de dados usaremos o SQLite, que você pode instalar pelo gerenciador de pacotes:
    sudo apt-get install sqlite3 libsqlite3-dev
    
    Após a instalação, a biblioteca de desenvolvimento libsqlite3-dev do banco SQLite garante que possamos usar o SQLite normalmente em C++.

2. Criar a estrutura do projeto

Dividiremos o código em vários módulos, mantendo uma arquitetura clara: - folder_size.h / folder_size.cpp: responsáveis por calcular recursivamente o tamanho do diretório e de seus subdiretórios. - database.h / database.cpp: encapsulam a lógica de operação do banco de dados SQLite. - main.cpp: entrada do programa principal, responsável pelo controle do fluxo geral.

A estrutura de diretórios do projeto é a seguinte:

project/
│── folder_size.h
│── folder_size.cpp
│── database.h
│── database.cpp
└── main.cpp

3. Implementação do código

Em seguida, implementaremos cada módulo passo a passo.

3.1 Módulo de cálculo de diretórios

O C++17 fornece a biblioteca std::filesystem para percorrer diretórios recursivamente e calcular tamanhos. Portanto, sua implementação central é a seguinte:

uintmax_t total_size = 0;
for (const auto& entry : fs::recursive_directory_iterator(dir_path)) {
  if (fs::is_regular_file(entry.path())) {
    total_size += fs::file_size(entry.path());
  }
}
Se quiser calcular o diretório raiz, basta calcular mais uma vez.

3.2 Operações com o banco SQLite

Include:

#include <sqlite3.h>
Uso:

sqlite3_close(db_); // 关闭

// 插入
for (const auto& [folder, size] : folder_sizes) {
  const std::string insert_sql = 
      "INSERT OR REPLACE INTO FolderSizes (Folder, Size) "
      "VALUES ('" + folder + "', " + std::to_string(size) + ");";
  if (!ExecuteSQL(insert_sql)) {
    return false;
  }
}

// 执行
sqlite3_exec

4. Compilação e execução

Compilar o projeto é muito simples:

mkdir build
cmake ../
make -j8
Depois, execute o programa para calcular o tamanho dos diretórios e armazená-lo no banco de dados:

./folder_size_calculator
O programa calculará recursivamente o tamanho do diretório especificado e salvará o resultado no banco de dados folder_sizes.db.

5. Consultar o banco de dados

Por fim, você pode consultar o conteúdo do banco de dados pela

ferramenta de linha de comando do SQLite:

sqlite3 folder_sizes.db
sqlite> SELECT * FROM FolderSizes;
Isso exibirá todos os diretórios já salvos e seus respectivos tamanhos.

Fim desta seção

Tópicos relacionados

Comentários