Перейти к содержанию

Последнее обновление:2026-10-12

C++17 и SQLite: подсчёт размера каталога

Проектная практика: подсчёт и сохранение размеров папок с помощью C++17 и SQLite

Этот раздел построен вокруг следующей проектной задачи: предположим, бизнесу нужно периодически проверять размеры некоторых каталогов и сохранять результаты; как реализовать такой проект на C++?

В этом разделе через небольшой проект вы с помощью C++17 и SQLite реализуете систему подсчёта и сохранения размеров папок, которая поможет лучше управлять вашей файловой системой.

Цели проекта

Мы реализуем следующие функции: 1. Рекурсивный подсчёт размера указанного каталога и его подкаталогов. 2. Сохранение результатов в базу данных SQLite для удобства последующих запросов и анализа. 3. Высокая расширяемость: вы легко можете доработать проект — добавить многопоточность, оптимизировать производительность или сохранять результаты в другую базу данных.

Примечание: для ленивых — полный код уже выложен в закрытом сообществе.

Шаги реализации проекта

1. Окружение

Прежде всего убедитесь, что в среде разработки установлены следующие инструменты: - Компилятор с поддержкой C++17: например, g++; проверить версию можно командой:

g++ --version
Убедитесь, что g++ поддерживает стандарт C++17.

  • SQLite3: для работы с базой данных мы будем использовать SQLite; установить его можно через менеджер пакетов:
    sudo apt-get install sqlite3 libsqlite3-dev
    
    После установки библиотека разработки libsqlite3-dev обеспечит нормальную работу с SQLite из C++.

2. Создание структуры проекта

Мы разобьём код на несколько модулей, сохранив ясную архитектуру: - folder_size.h / folder_size.cpp: отвечает за рекурсивный подсчёт размера каталога и его подкаталогов. - database.h / database.cpp: инкапсулирует логику работы с базой данных SQLite. - main.cpp: точка входа основной программы, управляет общим потоком выполнения.

Структура каталогов проекта следующая:

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

3. Реализация кода

Далее мы шаг за шагом реализуем каждый модуль.

3.1 Модуль подсчёта каталогов

В C++17 для рекурсивного обхода каталогов и подсчёта размеров есть библиотека std::filesystem. Поэтому ключевая реализация выглядит так:

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());
  }
}
Если нужно посчитать корневой каталог — просто посчитайте ещё раз.

3.2 Операции с базой данных SQLite

Подключаем:

#include <sqlite3.h>
Использование:

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. Компиляция и запуск

Собрать проект очень просто:

mkdir build
cmake ../
make -j8
Затем запустите программу, которая посчитает размеры каталогов и сохранит их в базу данных:

./folder_size_calculator
Программа рекурсивно посчитает размер указанного каталога и сохранит результат в базу данных folder_sizes.db.

5. Запросы к базе данных

Наконец, вы можете через

SQLite-инструмент командной строки запросить содержимое базы данных:

sqlite3 folder_sizes.db
sqlite> SELECT * FROM FolderSizes;
Это выведет все сохранённые каталоги и их размеры.

Конец раздела

Похожие темы

Комментарии