1 #pragma once 2 3 #include <stdio.h> 4 #include <experimental/filesystem> 5 namespace phosphor 6 { 7 namespace user 8 { 9 10 namespace fs = std::experimental::filesystem; 11 12 /** @class File 13 * @brief Responsible for handling file pointer 14 * Needed by putspent(3) 15 */ 16 class File 17 { 18 private: 19 /** @brief handler for operating on file */ 20 FILE *fp = NULL; 21 22 /** @brief File name. Needed in the case where the temp 23 * needs to be removed 24 */ 25 const std::string& name; 26 27 /** @brief Should the file be removed at exit */ 28 bool removeOnExit = false; 29 30 public: 31 File() = delete; 32 File(const File&) = delete; 33 File& operator=(const File&) = delete; 34 File(File&&) = delete; 35 File& operator=(File&&) = delete; 36 37 /** @brief Opens file and uses it to do file operation 38 * 39 * @param[in] name - File name 40 * @param[in] mode - File open mode 41 * @param[in] removeOnExit - File to be removed at exit or no 42 */ 43 File(const std::string& name, 44 const std::string& mode, 45 bool removeOnExit = false) : 46 name(name), 47 removeOnExit(removeOnExit) 48 { 49 fp = fopen(name.c_str(), mode.c_str()); 50 } 51 52 ~File() 53 { 54 if (fp) 55 { 56 fclose(fp); 57 } 58 59 // Needed for exception safety 60 if (removeOnExit && fs::exists(name)) 61 { 62 fs::remove(name); 63 } 64 } 65 66 auto operator()() 67 { 68 return fp; 69 } 70 }; 71 72 } // namespace user 73 } // namespace phosphor 74