file.hpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #pragma once
  2. #include <QString>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <QFileInfo>
  6. #include <QJsonDocument>
  7. #include <QJsonObject>
  8. enum FileMode {
  9. fmRead = QFile::ReadOnly,
  10. fmWrite = QFile::WriteOnly | QFile::Truncate,
  11. fmReadWrite = QFile::ReadWrite,
  12. fmText = QFile::Text,
  13. fmAppend = QFile::Append,
  14. fmReplace = QFile::Truncate,
  15. };
  16. struct File
  17. {
  18. File(QString filename, int mode = fmRead);
  19. ~File();
  20. QFile fs;
  21. QString all();
  22. QJsonDocument allJson();
  23. void writeAll(QByteArray const& data);
  24. void writeAll(QString const& data);
  25. void writeAll(QJsonDocument const& data, QJsonDocument::JsonFormat format = QJsonDocument::Compact);
  26. void writeAll(QJsonObject const& data, QJsonDocument::JsonFormat format = QJsonDocument::Compact);
  27. void writeAll(QJsonArray const& data, QJsonDocument::JsonFormat format = QJsonDocument::Compact);
  28. void close();
  29. void needOpen();
  30. void needOpen(QFile::OpenMode om);
  31. bool openned = false;
  32. QFile::OpenMode mode;
  33. };
  34. template<class T>
  35. File& operator<<(File&& o, T const& v) {
  36. o.fs.write(v);
  37. return o;
  38. }
  39. inline File::File(QString filename, int mode) : fs(filename), mode(mode)
  40. {}
  41. inline File::~File()
  42. {
  43. if (openned) fs.close();
  44. }
  45. inline QString File::all()
  46. {
  47. needOpen(QFile::ReadOnly | QFile::Text);
  48. auto res = fs.readAll();
  49. close();
  50. return res;
  51. }
  52. inline QJsonDocument File::allJson()
  53. {
  54. needOpen(QFile::ReadOnly | QFile::Text);
  55. auto res = QJsonDocument::fromJson(fs.readAll());
  56. close();
  57. return res;
  58. }
  59. inline void File::writeAll(QByteArray const& data)
  60. {
  61. needOpen(QFile::WriteOnly | QFile::Truncate);
  62. fs.write(data);
  63. close();
  64. }
  65. inline void File::writeAll(const QString& data)
  66. {
  67. needOpen(QFile::WriteOnly | QFile::Truncate | QFile::Text);
  68. fs.write(data.toUtf8());
  69. close();
  70. }
  71. inline void File::writeAll(const QJsonDocument& data, QJsonDocument::JsonFormat format)
  72. {
  73. needOpen(QFile::WriteOnly | QFile::Truncate | QFile::Text);
  74. fs.write(data.toJson(format));
  75. close();
  76. }
  77. inline void File::writeAll(const QJsonObject& data, QJsonDocument::JsonFormat format)
  78. {
  79. writeAll(QJsonDocument(data), format);
  80. }
  81. inline void File::writeAll(const QJsonArray& data, QJsonDocument::JsonFormat format)
  82. {
  83. writeAll(QJsonDocument(data), format);
  84. }
  85. inline void File::close()
  86. {
  87. if (openned) fs.close();
  88. openned = false;
  89. }
  90. inline void File::needOpen()
  91. {
  92. if (!openned) fs.open(mode);
  93. openned = true;
  94. }
  95. inline void File::needOpen(QIODevice::OpenMode om)
  96. {
  97. if (mode != om) {
  98. if (openned) fs.close();
  99. fs.open(om);
  100. mode = om;
  101. openned = true;
  102. } else if (!openned) {
  103. fs.open(om);
  104. openned = true;
  105. }
  106. }
  107. inline std::ostream& operator<<(std::ostream& o, QString const& s) {
  108. return o << s.toUtf8().data();
  109. }
  110. inline bool fileExists(QString path) {
  111. QFileInfo check_file(path);
  112. return check_file.exists() && check_file.isFile();
  113. }
  114. inline bool exists(QString path) {
  115. QFileInfo check_file(path);
  116. return check_file.exists();
  117. }