filemanager.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #pragma once
  2. #include "common.h"
  3. #include "rcglobal.h"
  4. #include <QString>
  5. #include <QObject>
  6. #include <QList>
  7. #include <QFile>
  8. class ScintillaEditView;
  9. class ScintillaHexEditView;
  10. //小于100k的文件一次性全部读取完毕
  11. const int LITTLE_FILE_MAX = 1024000;
  12. enum ERROR_TYPE {
  13. NONE_ERROR=-1,
  14. OPEN_EMPTY_FILE=0,
  15. };
  16. struct NewFileIdMgr {
  17. int index;
  18. ScintillaEditView* editView;
  19. NewFileIdMgr(int index_, ScintillaEditView* editView_):index(index_), editView(editView_)
  20. {
  21. }
  22. };
  23. //管理二进制文件的信息
  24. struct HexFileMgr {
  25. QString filePath;
  26. QFile* file;
  27. qint64 fileOffset;
  28. qint64 fileSize;
  29. qint16 lineSize;//每次读取多少行,默认为64行,没行16个字符
  30. char* contentBuf;
  31. int contentRealSize;
  32. bool onetimeRead; //是否一次性全部读取到内存。小于等于LITTLE_FILE_MAX的才会全部读取
  33. HexFileMgr() :file(nullptr), fileOffset(0), lineSize(64), fileSize(0), contentBuf(nullptr), contentRealSize(0),onetimeRead(false)
  34. {
  35. }
  36. void destory()
  37. {
  38. if (file != nullptr)
  39. {
  40. file->close();
  41. delete file;
  42. file = nullptr;
  43. }
  44. if (contentBuf != nullptr)
  45. {
  46. delete[]contentBuf;
  47. contentBuf = nullptr;
  48. }
  49. }
  50. private:
  51. HexFileMgr& operator=(const HexFileMgr&) = delete;
  52. HexFileMgr(const HexFileMgr&) = delete;
  53. };
  54. //管理大文本文件的信息
  55. struct TextFileMgr {
  56. QString filePath;
  57. QFile* file;
  58. qint64 fileOffset;
  59. qint64 fileSize;
  60. qint16 lineSize;//每次读取多少行,默认每次读取1024行。但是最大不超过1M的内容。
  61. char* contentBuf;
  62. int contentRealSize;
  63. int loadWithCode;
  64. int lineEndType;//行尾类型,win linux mac
  65. TextFileMgr() :file(nullptr), fileOffset(0), lineSize(64), fileSize(0), contentBuf(nullptr), contentRealSize(0), loadWithCode(CODE_ID::UNKOWN),lineEndType(RC_LINE_FORM::UNKNOWN_LINE)
  66. {
  67. }
  68. void destory()
  69. {
  70. if (file != nullptr)
  71. {
  72. file->close();
  73. delete file;
  74. file = nullptr;
  75. }
  76. if (contentBuf != nullptr)
  77. {
  78. delete[]contentBuf;
  79. contentBuf = nullptr;
  80. }
  81. }
  82. private:
  83. TextFileMgr& operator=(const TextFileMgr&) = delete;
  84. TextFileMgr(const TextFileMgr&) = delete;
  85. };
  86. struct BlockIndex {
  87. qint64 fileOffset;//块的开始地址
  88. quint32 fileSize;//块的大小
  89. quint32 lineNumStart;//块中行号的开始值
  90. quint32 lineNum;//块中的行数量
  91. };
  92. //管理大文本文件,可以编辑的信息
  93. struct BigTextEditFileMgr {
  94. QString filePath;
  95. QFile* file;
  96. uchar* filePtr;//使用的是文件映射的方式打开
  97. quint32 m_curBlockIndex; //当前展示中的块索引序号
  98. int loadWithCode; //以何种编码来加载解析文件。默认UTF8
  99. int lineEndType;//行尾类型,win linux mac
  100. static const qint16 BLOCK_SIZE = 1;//块大小,单位M。开始是4M,发现块越大,行越多,那么在一块中定位行的位置越慢
  101. QVector<BlockIndex> blocks;//每一块的索引。打开文件的时候,需要建立该索引
  102. BigTextEditFileMgr():filePtr(nullptr), file(nullptr), m_curBlockIndex(0), loadWithCode(CODE_ID::UNKOWN), lineEndType(RC_LINE_FORM::UNKNOWN_LINE)
  103. {
  104. }
  105. void destory()
  106. {
  107. if (filePtr != nullptr)
  108. {
  109. if (file != nullptr)
  110. {
  111. file->unmap(filePtr);
  112. file->close();
  113. delete file;
  114. file = nullptr;
  115. }
  116. filePtr = nullptr;
  117. }
  118. }
  119. private:
  120. BigTextEditFileMgr& operator=(const TextFileMgr&) = delete;
  121. BigTextEditFileMgr(const TextFileMgr&) = delete;
  122. };
  123. class CCNotePad;
  124. class FileManager:public QObject
  125. {
  126. Q_OBJECT
  127. public:
  128. ScintillaEditView* newEmptyDocument(bool isBigText = false);
  129. ScintillaHexEditView * newEmptyHexDocument();
  130. int getNextNewFileId();
  131. void insertNewFileNode(NewFileIdMgr node);
  132. void delNewFileNode(int fileIndex);
  133. int loadFileDataInTextFromOffset(ScintillaEditView* editView, QString filePath, CODE_ID fileTextCode, QWidget* msgBoxParent, quint64 startReadSize);
  134. //下面这个是旧函数,之前对比时候用的。
  135. //int loadFileDataInText(ScintillaEditView * editView, QString filePath, CODE_ID & fileTextCode, RC_LINE_FORM &lineEnd, CCNotePad * callbackObj=nullptr, bool hexAsk = true, QWidget* MsgBoxParent=nullptr);
  136. int loadFileDataInText(ScintillaEditView* editView, QString filePath, CODE_ID& fileTextCode, RC_LINE_FORM& lineEnd, CCNotePad* callbackObj = nullptr, bool hexAsk = true, QWidget* msgBoxParent = nullptr);
  137. int loadFileForSearch(ScintillaEditView * editView, QString filePath);
  138. //int loadFileData(ScintillaEditView * editView, QString filePath, CODE_ID & fileTextCode, RC_LINE_FORM & lineEnd);
  139. int loadFilePreNextPage(int dir, QString & filePath, HexFileMgr *& hexFileOut);
  140. int loadFilePreNextPage(int dir, QString & filePath, TextFileMgr *& hexFileOut);
  141. int loadFileFromAddr(QString filePath, qint64 addr, HexFileMgr *& hexFileOut);
  142. int loadFileFromAddr(QString filePath, qint64 addr, TextFileMgr *& hexFileOut);
  143. bool loadFileData(QString filePath, HexFileMgr * & hexFileOut);
  144. bool loadFileData(QString filePath, TextFileMgr *& textFileOut, RC_LINE_FORM & lineEnd);
  145. bool loadFileDataWithIndex(QString filePath, BigTextEditFileMgr*& textFileOut);
  146. HexFileMgr* getHexFileHand(QString filepath);
  147. BigTextEditFileMgr* getBigFileEditMgr(QString filepath);
  148. TextFileMgr* getSuperBigFileMgr(QString filepath);
  149. int getBigFileBlockId(QString filepath, quint32 lineNum);
  150. void closeHexFileHand(QString filepath);
  151. void closeSuperBigTextFileHand(QString filepath);
  152. void closeBigTextRoFileHand(QString filepath);
  153. static FileManager& getInstance() {
  154. static FileManager instance;
  155. return instance;
  156. };
  157. ERROR_TYPE getLastErrorCode()
  158. {
  159. return m_lastErrorCode;
  160. }
  161. void resetLastErrorCode()
  162. {
  163. m_lastErrorCode = NONE_ERROR;
  164. }
  165. private:
  166. FileManager();
  167. ~FileManager();
  168. int createBlockIndex(BigTextEditFileMgr* txtFile);
  169. FileManager(const FileManager&) = delete;
  170. FileManager& operator=(const FileManager&) = delete;
  171. QList<NewFileIdMgr> m_newFileIdList;
  172. QMap<QString, HexFileMgr*> m_hexFileMgr;
  173. QMap<QString, TextFileMgr*> m_bigTxtFileMgr;
  174. QMap<QString, BigTextEditFileMgr*> m_bigTxtEditFileMgr;
  175. ERROR_TYPE m_lastErrorCode;
  176. };