项目实战:使用 C++17 和 SQLite 实现文件夹大小计算与存储
大纲
项目目标
项目实现步骤
本节将会围绕一个项目背景展开:假设业务中需要定时检查某些文件夹大小,并做一下持久化操作,C++如何去完成这一个项目呢?
本节带你通过一个小项目,使用 C++17 和 SQLite 实现一个文件夹大小计算与存储的系统,帮助你更好地管理你的文件系统。
注:懒人版,完整代码已更新星球。
项目目标
我们将实现以下功能:
递归计算指定目录及其子目录的大小。
将计算结果保存到 SQLite 数据库,方便后续查询和分析。
可扩展性强:你可以轻松修改项目,添加多线程支持、优化性能,或将结果存储到其他数据库中。
项目实现步骤
1. 环境
首先,你需要确保开发环境中已经安装了以下工具:
支持C++17 编译器:如 g++,通过以下命令可以检查版本:
g++ --version
确保 g++ 支持 C++17 标准。
SQLite3:数据库操作我们会使用 SQLite,你可以通过包管理器来安装它:
sudo apt-get install sqlite3 libsqlite3-dev
安装完后,SQLite 数据库的开发库
libsqlite3-dev
可以确保我们在 C++ 中能正常使用 SQLite。
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;
这将显示所有已保存的目录及其对应的大小。
本节完
一起探索更多C++项目/知识~
往期推荐: