PocketLzma  1.0.0
A cross-platform singleheader LZMA compression/decompression library for C++11
File.hpp
Go to the documentation of this file.
1 //
2 // Created by robin on 28.12.2020.
3 //
4 
5 #ifndef POCKETLZMA_FILE_HPP
6 #define POCKETLZMA_FILE_HPP
7 
8 #include "MemoryStream.hpp"
9 #include <fstream>
10 namespace plz
11 {
12  class File
13  {
14  public:
15  File() = delete;
16  static inline std::vector<uint8_t> FromMemory(const void *data, size_t size);
17  static inline void FromMemory(const void *data, size_t size, std::vector<uint8_t> &output);
18 
19  static inline std::vector<uint8_t> FromFile(const std::string &path);
20  static inline FileStatus FromFile(const std::string &path, std::vector<uint8_t> &output);
21 
22  static inline FileStatus ToFile(const std::string &path, const std::vector<uint8_t> &data);
23  };
24 
25  std::vector<uint8_t> File::FromMemory(const void *data, size_t size)
26  {
27  std::vector<uint8_t> bytes(size);
28  FromMemory(data, size, bytes);
29  return bytes;
30  }
31 
32  void File::FromMemory(const void *data, size_t size, std::vector<uint8_t> &output)
33  {
34  output.resize(size);
35  plz::MemoryStream mem {(uint8_t *)data, size};
36  mem.read((char *)&output[0], size);
37  }
38 
39  std::vector<uint8_t> File::FromFile(const std::string &path)
40  {
41  std::fstream file;
42  file = std::fstream(path, std::ios::in | std::ios::binary);
43 
44  //Find size
45  file.seekg(0, std::ios::end);
46  size_t fileSize = file.tellg();
47  file.seekg(0, std::ios::beg);
48 
49  std::vector<uint8_t> bytes(fileSize);
50 
51  file.read((char *)&bytes[0], fileSize);
52  file.close();
53 
54  return bytes;
55  }
56 
57  FileStatus File::FromFile(const std::string &path, std::vector<uint8_t> &output)
58  {
59  std::fstream file;
60  try
61  {
62  file = std::fstream(path, std::ios::in | std::ios::binary);
63  file.exceptions(std::fstream::failbit | std::fstream::badbit);
64  bool isBad = file.bad();
65  bool isFail = file.fail();
66  bool isOpen = file.is_open();
67 
68  if(isBad || isFail || !isOpen)
69  file.close();
70 
71  if(isBad)
73  else if(isFail)
75  else if(!isOpen)
76  return FileStatus(FileStatus::Code::FileWriteError, 0, "", "", "");
77 
78  //Find size
79  file.seekg(0, std::ios::end);
80  size_t fileSize = file.tellg();
81  file.seekg(0, std::ios::beg);
82 
83  output.resize(fileSize);
84 
85  file.read((char *) &output[0], fileSize);
86  file.close();
87 
88  return FileStatus();
89  }
90  catch (const std::fstream::failure &e)
91  {
92  if(file.is_open())
93  file.close();
94 
95  return FileStatus(FileStatus::Code::FileReadError, e.code().value(), e.what(), e.code().category().name(), e.code().message());
96  }
97  }
98 
99  FileStatus File::ToFile(const std::string &path, const std::vector<uint8_t> &data)
100  {
101  std::fstream file;
102  file.exceptions(std::fstream::failbit | std::fstream::badbit);
103 
104  try
105  {
106  file = std::fstream(path, std::ios::out | std::ios::binary);
107  bool isBad = file.bad();
108  bool isFail = file.fail();
109  bool isOpen = file.is_open();
110 
111  if(isBad || isFail || !isOpen)
112  file.close();
113 
114  if(isBad)
115  return FileStatus(FileStatus::Code::FileWriteErrorBadBit, 0, "", "", "");
116  else if(isFail)
118  else if(!isOpen)
119  return FileStatus(FileStatus::Code::FileWriteError, 0, "", "", "");
120 
121  for (const auto &b : data) //b = byte
122  file << b;
123 
124  file.close();
125  return FileStatus();
126  }
127  catch (const std::fstream::failure &e)
128  {
129  if(file.is_open())
130  file.close();
131 
132  return FileStatus(FileStatus::Code::FileWriteError, e.code().value(), e.what(), e.code().category().name(), e.code().message());
133  }
134  }
135 }
136 
137 #endif //POCKETLZMA_FILE_HPP
plz::File::ToFile
static FileStatus ToFile(const std::string &path, const std::vector< uint8_t > &data)
Definition: File.hpp:99
MemoryStream.hpp
plz::FileStatus::Code::FileWriteError
@ FileWriteError
plz::MemoryStream
Definition: MemoryStream.hpp:12
plz::FileStatus::Code::FileWriteErrorBadBit
@ FileWriteErrorBadBit
plz::FileStatus
Definition: FileStatus.hpp:11
plz::File
Definition: File.hpp:13
plz::File::FromMemory
static std::vector< uint8_t > FromMemory(const void *data, size_t size)
Definition: File.hpp:25
plz::File::File
File()=delete
plz::FileStatus::Code::FileWriteErrorFailBit
@ FileWriteErrorFailBit
plz::File::FromFile
static std::vector< uint8_t > FromFile(const std::string &path)
Definition: File.hpp:39
plz
Definition: File.hpp:11
plz::FileStatus::Code::FileReadError
@ FileReadError