C++ Qtで一時ファイルを扱う方法について、手動管理やRAIIなどの手法を紹介します。
1. 手動管理
最も基本的な方法として、手動で一時ファイルを作成し、使用後は手動で削除します。コードが単純な場合はこれで十分ですが、複雑なロジックや分岐がある場合、一時ファイルの削除を忘れる可能性があります。
#include <QFile>
#include <QDir>
void example1() {
QString tempFilePath = QDir::tempPath() + "/example1.txt";
QFile file(tempFilePath);
if (file.open(QIODevice::WriteOnly)) {
file.write("こんにちは、世界!");
file.close();
}
// 処理
file.remove();
}
2. RAII
RAII(リソース獲得は初期化)は、オブジェクトのコンストラクタでリソースを確保し、デストラクタでリソースを解放するプログラミング手法です。
2.1. ScopedGuard
ScopedGuardは、オブジェクトがスコープ外に出たときに指定した関数を呼び出す簡単なRAIIクラスです。
#include <QFile>
#include <QDir>
#include <functional>
class ResourceGuard {
public:
ResourceGuard(std::function<void()> func) : releaseFunc(func) {}
~ResourceGuard() { releaseFunc(); }
private:
std::function<void()> releaseFunc;
};
void example2() {
QString tempFilePath = QDir::tempPath() + "/example2.txt";
QFile file(tempFilePath);
if (file.open(QIODevice::WriteOnly)) {
file.write("こんにちは、世界!");
file.close();
}
ResourceGuard guard([&]() { file.remove(); });
// 処理
}
2.2. スマートポインタ(推奨)
スマートポインタを使用して一時ファイルを管理すると、手動で削除する必要がなくなります。
#include <QFile>
#include <QDir>
#include <memory>
struct FileCleaner {
void operator()(QFile* file) const {
file->remove();
delete file;
}
};
void example3() {
QString tempFilePath = QDir::tempPath() + "/example3.txt";
QFile* file = new QFile(tempFilePath);
if (file->open(QIODevice::WriteOnly)) {
file->write("こんにちは、世界!");
file->close();
}
std::unique_ptr<QFile, FileCleaner> managedFile(file);
// 処理
}
さらに簡潔に、lambdaを使用することも可能です。
#include <QFile>
#include <QDir>
#include <memory>
void example4() {
QString tempFilePath = QDir::tempPath() + "/example4.txt";
QFile* file = new QFile(tempFilePath);
if (file->open(QIODevice::WriteOnly)) {
file->write("こんにちは、世界!");
file->close();
}
std::unique_ptr<QFile, std::function<void(QFile*)>> managedFile(file, [](QFile* f) {
f->remove();
delete f;
});
// 処理
}
2.3. QScopeGuard(推奨)
Qt 5.12以降から利用可能なQScopeGuardは、スマートポインタと同様にスコープ外に出たときに指定した関数を実行します。
#include <QFile>
#include <QDir>
#include <QScopeGuard>
void example5() {
QString tempFilePath = QDir::tempPath() + "/example5.txt";
QFile* file = new QFile(tempFilePath);
if (file->open(QIODevice::WriteOnly)) {
file->write("こんにちは、世界!");
file->close();
}
auto cleanup = qScopeGuard([&]() {
file->remove();
delete file;
});
// 処理
}
2.4. QTemporaryFile(推奨)
QTemporaryFileは、オブジェクトが破棄されたときに自動的に一時ファイルを削除するQt提供のクラスです。
#include <QTemporaryFile>
void writeData(const QString& filePath) {
// ファイルへの書き込み処理
}
void encryptData(const QString& filePath) {
// ファイルの暗号化処理
}
void example6() {
QTemporaryFile tempFile;
if (tempFile.open()) {
writeData(tempFile.fileName());
encryptData(tempFile.fileName());
}
// 処理
}
QTemporaryFileを使用することで、ファイル名やパスに関する問題を気にせずに済みます。