Saltar a contenido

Última actualización:2026-10-12

C++17 y SQLite para medir el tamaño de directorios

Proyecto práctico: cálculo y almacenamiento del tamaño de carpetas con C++17 y SQLite

Esta sección girará en torno al trasfondo de un proyecto: supongamos que el negocio necesita comprobar periódicamente el tamaño de ciertas carpetas y hacer una operación de persistencia, ¿cómo completar este proyecto en C++?

En esta sección, a través de un pequeño proyecto, implementarás con C++17 y SQLite un sistema de cálculo y almacenamiento del tamaño de carpetas que te ayudará a gestionar mejor tu sistema de archivos.

Objetivo del proyecto

Implementaremos las siguientes funciones: 1. Calcular recursivamente el tamaño del directorio indicado y sus subdirectorios. 2. Guardar el resultado del cálculo en una base de datos SQLite, para facilitar consultas y análisis posteriores. 3. Muy escalable: puedes modificar el proyecto con facilidad, añadir soporte multihilo, optimizar el rendimiento o almacenar los resultados en otra base de datos.

Nota: para perezosos, el código completo ya está publicado en la comunidad 星球.

Pasos de implementación del proyecto

1. Entorno

En primer lugar, debes asegurarte de tener instaladas en el entorno de desarrollo las herramientas siguientes: - Un compilador con soporte de C++17: por ejemplo g++; puedes comprobar la versión con el comando siguiente:

g++ --version
Asegúrate de que g++ admite el estándar C++17.

  • SQLite3: para las operaciones con la base de datos usaremos SQLite; puedes instalarlo con el gestor de paquetes:
    sudo apt-get install sqlite3 libsqlite3-dev
    
    Tras la instalación, la biblioteca de desarrollo libsqlite3-dev de la base de datos SQLite garantiza que podamos usar SQLite con normalidad en C++.

2. Crear la estructura del proyecto

Dividiremos el código en varios módulos para mantener una arquitectura clara: - folder_size.h / folder_size.cpp: se encargan de calcular recursivamente el tamaño del directorio y sus subdirectorios. - database.h / database.cpp: encapsulan la lógica de las operaciones con la base de datos SQLite. - main.cpp: entrada del programa principal, encargada del control del flujo general.

La estructura de directorios del proyecto es la siguiente:

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

3. Implementación del código

A continuación implementaremos cada módulo paso a paso.

3.1 Módulo de cálculo de directorios

C++17 ofrece la biblioteca std::filesystem para recorrer directorios de forma recursiva y calcular tamaños. Por eso su implementación central es la siguiente:

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());
  }
}

Si quieres calcular el directorio raíz, basta con calcularlo una vez más.

3.2 Operaciones con la base de datos SQLite

Incluir:

#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. Compilar y ejecutar

Compilar el proyecto es muy sencillo:

mkdir build
cmake ../
make -j8

Después, ejecuta el programa para calcular el tamaño del directorio y almacenarlo en la base de datos:

./folder_size_calculator

El programa calculará recursivamente el tamaño del directorio indicado y guardará el resultado en la base de datos folder_sizes.db.

5. Consultar la base de datos

Por último, puedes consultar el contenido de la base de datos mediante la herramienta de línea de comandos de SQLite:

sqlite3 folder_sizes.db
sqlite> SELECT * FROM FolderSizes;

Esto mostrará todos los directorios guardados y su tamaño correspondiente.

Fin de esta sección

Temas relacionados

Comentarios