HDF5: Improvements in data file and master file safety.

This commit is contained in:
2026-05-04 11:23:18 +02:00
parent 18a9c0bcc1
commit 0a2c370983
2 changed files with 49 additions and 10 deletions
+22 -8
View File
@@ -78,11 +78,22 @@ std::optional<HDF5DataFileStatistics> HDF5DataFile::Close() {
data_set->Close();
data_set.reset();
}
data_file->Close();
data_file.reset();
if (manage_file && (!std::filesystem::exists(filename.c_str()) || overwrite))
std::rename(tmp_filename.c_str(), filename.c_str());
if (manage_file ) {
data_file->Close();
data_file.reset();
if (std::filesystem::exists(filename) && !overwrite)
throw JFJochException(JFJochExceptionCategory::FileWriteError, "File already exists");
std::error_code ec;
std::filesystem::rename(tmp_filename, filename, ec);
if (ec)
throw JFJochException(JFJochExceptionCategory::FileWriteError,
"Cannot rename temporary HDF5 file " + tmp_filename +
" to " + filename + ": " + ec.message());
} else {
data_file.reset();
}
closed = true;
@@ -92,16 +103,19 @@ std::optional<HDF5DataFileStatistics> HDF5DataFile::Close() {
ret.filename = filename;
ret.file_number = file_number + 1;
return ret;
}
HDF5DataFile::~HDF5DataFile() {
if (data_file) {
try {
data_set->Close();
data_file->Close();
std::filesystem::remove(tmp_filename);
data_set.reset();
data_set_image_number.reset();
data_file.reset();
if (manage_file) {
std::error_code ec;
std::filesystem::remove(tmp_filename, ec);
}
} catch (const std::exception &e) {
std::cerr << "HDF5DataFile::~HDF5DataFile: " << e.what() << std::endl;
} catch (...) {