最終更新: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 を使用します。パッケージマネージャからインストールできます:
インストール完了後、SQLite データベースの開発ライブラリ
libsqlite3-devによって、C++ で SQLite を正常に利用できるようになります。
2. プロジェクト構造の作成¶
コードを複数のモジュールに分け、明快なアーキテクチャを保ちます:
- folder_size.h / folder_size.cpp:ディレクトリとそのサブディレクトリのサイズの再帰計算を担当します。
- database.h / database.cpp:SQLite データベース操作のロジックをカプセル化します。
- main.cpp:メインプログラムの入口で、全体のフローを制御します。
プロジェクトのディレクトリ構造は次のとおりです:
3. コード実装¶
次に、各モジュールを 1 歩ずつ実装していきます。
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++ 短縮URLサービス Demo | C++那些事
- Google Benchmark 性能テスト | C++那些事
- C++20 コルーチン HTTP サーバ | C++那些事
- Protobuf ZeroCopy シリアライズ | C++那些事
- pybind11 で Python を高速化 | C++那些事
- C++ スタック型電卓の設計 | C++那些事