1 #pragma once 2 3 #include <filesystem> 4 #include <utility> 5 6 namespace openpower 7 { 8 namespace pels 9 { 10 namespace util 11 { 12 13 namespace fs = std::filesystem; 14 15 /** 16 * @class TemporaryFile 17 * 18 * A temporary file in the file system. 19 * 20 * The temporary file is created by the constructor. The absolute path to the 21 * file can be obtained using getPath(). 22 * 23 * Note: Callers responsibility to delete the file after usage. 24 * The temporary file can be deleted by calling remove(). 25 * 26 * TemporaryFile objects cannot be copied, but they can be moved. This enables 27 * them to be stored in containers like std::vector. 28 */ 29 class TemporaryFile 30 { 31 public: 32 // Specify which compiler-generated methods we want 33 TemporaryFile(const TemporaryFile&) = delete; 34 TemporaryFile& operator=(const TemporaryFile&) = delete; 35 36 /** 37 * Constructor. 38 * 39 * Creates a temporary file in the temporary directory (normally /tmp). 40 * 41 * Throws an exception if the file cannot be created. 42 * 43 * @param data - data buffer 44 * @param len - length of the data buffer 45 */ 46 TemporaryFile(const char* data, const uint32_t len); 47 48 /** 49 * Move constructor. 50 * 51 * Transfers ownership of a temporary file. 52 * 53 * @param file TemporaryFile object being moved 54 */ 55 TemporaryFile(TemporaryFile&& file) : path{std::move(file.path)} 56 { 57 // Clear path in other object; after move path is in unspecified state 58 file.path.clear(); 59 } 60 61 /** 62 * Move assignment operator. 63 * 64 * Deletes the temporary file owned by this object. Then transfers 65 * ownership of the temporary file owned by the other object. 66 * 67 * Throws an exception if an error occurs during the deletion. 68 * 69 * @param file TemporaryFile object being moved 70 */ 71 TemporaryFile& operator=(TemporaryFile&& file); 72 73 /** 74 * Destructor. 75 */ 76 ~TemporaryFile() 77 { 78 } 79 80 /** 81 * Deletes the temporary file. 82 * 83 * Does nothing if the file has already been deleted. 84 * 85 * Throws an exception if an error occurs during the deletion. 86 */ 87 void remove(); 88 89 /** 90 * Returns the absolute path to the temporary file. 91 * 92 * Returns an empty path if the file has been deleted. 93 * 94 * @return temporary file path 95 */ 96 const fs::path& getPath() const 97 { 98 return path; 99 } 100 101 int getFd() const 102 { 103 return fd; 104 } 105 106 private: 107 /** 108 * Absolute path to the temporary file. 109 */ 110 fs::path path{}; 111 112 /** 113 * File descriptor of the temporary file. 114 */ 115 int fd; 116 }; 117 118 } // namespace util 119 } // namespace pels 120 } // namespace openpower 121