51 std::ios_base::openmode mode = std::ios_base::in |
53 :
file_handle(std::filesystem::path{file_name}.parent_path() /
54 std::filesystem::path{file_name}.stem(),
55 std::filesystem::path{file_name}.extension(), mode) {}
61 file_handle(
const std::string& name,
const std::string& extension,
62 std::ios_base::openmode mode = std::ios_base::in |
65 std::string file_name{name};
69 if (mode == std::ios_base::out ||
70 (mode == (std::ios_base::out | std::ios_base::binary))) {
73 name.empty() ?
"./detray_" + std::to_string(n_files) : file_name;
77 auto new_path = std::filesystem::path{new_name};
78 file_name = new_path.parent_path() / new_path.stem();
81 }
else if ((mode == std::ios_base::in) ||
82 (mode == (std::ios_base::in | std::ios_base::binary))) {
83 if (file_name.empty()) {
84 std::stringstream err_str{};
85 err_str <<
"File name empty";
87 DETRAY_FATAL_HOST(err_str.str());
88 throw std::invalid_argument(err_str.str());
91 std::filesystem::path file_path{file_name + extension};
92 if (!std::filesystem::exists(file_path)) {
93 std::stringstream err_str{};
94 err_str <<
"Could not open file: File does not exist: " << file_name
97 DETRAY_FATAL_HOST(err_str.str());
98 throw std::invalid_argument(err_str.str());
100 }
else if (file_name.empty()) {
101 DETRAY_VERBOSE_HOST(
"Empty file name");
105 const std::string file_path{file_name + extension};
108 if (n_files >= std::numeric_limits<std::uint_least16_t>::max()) {
109 std::stringstream err_str{};
110 err_str <<
"Could not open file: Too many files written: " << file_path;
112 DETRAY_FATAL_HOST(err_str.str());
113 throw std::runtime_error(err_str.str());
114 }
else if (n_open_files >= 1000u) {
115 std::stringstream err_str{};
116 err_str <<
"Could not open file: Too many files currently open: "
119 DETRAY_FATAL_HOST(err_str.str());
120 throw std::runtime_error(err_str.str());
124 m_stream.open(file_path, mode);
126 if (!m_stream.is_open()) {
127 std::stringstream err_str{};
128 err_str <<
"Could not open file: " << file_path;
130 DETRAY_FATAL_HOST(err_str.str());
131 throw std::runtime_error(err_str.str());