Последнее обновление:2026-10-12
C++17 и SQLite: подсчёт размера каталога¶
Проектная практика: подсчёт и сохранение размеров папок с помощью C++17 и SQLite¶
Этот раздел построен вокруг следующей проектной задачи: предположим, бизнесу нужно периодически проверять размеры некоторых каталогов и сохранять результаты; как реализовать такой проект на C++?
В этом разделе через небольшой проект вы с помощью C++17 и SQLite реализуете систему подсчёта и сохранения размеров папок, которая поможет лучше управлять вашей файловой системой.
Цели проекта¶
Мы реализуем следующие функции: 1. Рекурсивный подсчёт размера указанного каталога и его подкаталогов. 2. Сохранение результатов в базу данных SQLite для удобства последующих запросов и анализа. 3. Высокая расширяемость: вы легко можете доработать проект — добавить многопоточность, оптимизировать производительность или сохранять результаты в другую базу данных.
Примечание: для ленивых — полный код уже выложен в закрытом сообществе.
Шаги реализации проекта¶
1. Окружение¶
Прежде всего убедитесь, что в среде разработки установлены следующие инструменты: - Компилятор с поддержкой C++17: например, g++; проверить версию можно командой:
Убедитесь, что g++ поддерживает стандарт C++17.- SQLite3: для работы с базой данных мы будем использовать SQLite; установить его можно через менеджер пакетов:
После установки библиотека разработки
libsqlite3-devобеспечит нормальную работу с SQLite из C++.
2. Создание структуры проекта¶
Мы разобьём код на несколько модулей, сохранив ясную архитектуру:
- folder_size.h / folder_size.cpp: отвечает за рекурсивный подсчёт размера каталога и его подкаталогов.
- database.h / database.cpp: инкапсулирует логику работы с базой данных SQLite.
- 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¶
Подключаем:
Использование: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. Компиляция и запуск¶
Собрать проект очень просто:
Затем запустите программу, которая посчитает размеры каталогов и сохранит их в базу данных: Программа рекурсивно посчитает размер указанного каталога и сохранит результат в базу данныхfolder_sizes.db.
5. Запросы к базе данных¶
Наконец, вы можете через
SQLite-инструмент командной строки запросить содержимое базы данных:
Это выведет все сохранённые каталоги и их размеры.Конец раздела
Похожие темы¶
- Пишем C++ FnOnce вручную | C++那些事
- Небольшой проект на C++ gRPC | C++那些事
- Межпроцессное взаимодействие в C++ на практике | C++那些事
- Демо сервиса коротких ссылок на C++ | C++那些事
- Тестирование производительности Google Benchmark | C++那些事
- HTTP-сервер на корутинах C++20 | C++那些事
- Сериализация Protobuf ZeroCopy | C++那些事
- Ускорение Python с помощью pybind11 | C++那些事
- Проектирование стекового калькулятора на C++ | C++那些事