acl  3.5.3.0
queue_file.hpp
浏览该文件的文档.
1 #pragma once
2 #include <time.h>
3 #include "../stdlib/string.hpp"
4 #include "../stdlib/locker.hpp"
5 #include "../stdlib/noncopyable.hpp"
6 #include "queue_manager.hpp"
7 
8 #ifndef MAXPATH255
9 #define MAXPATH255 255
10 #endif
11 
12 namespace acl {
13 
14 class fstream;
15 
17 {
18 public:
19  queue_file();
20 
21  /**
22  * 获得文件流指针
23  * @return {acl::fstream*} 文件流指针, 如果为 NULL 则说明文件还未打开
24  */
25  fstream* get_fstream(void) const;
26 
27  /**
28  * 获得文件创建时间
29  * @return {time_t}, 返回自 1970 年以来的秒数, 如果返回值为 (time_t) -1,
30  * 则表示出错
31  */
32  time_t get_ctime(void) const;
33 
34  /**
35  * 向文件中写数据
36  * @param data {const void*} 数据地址
37  * @param len {size} 数据长度
38  * @return {bool} 写数据是否成功
39  */
40  bool write(const void* data, size_t len);
41  int format(const char* fmt, ...) ACL_CPP_PRINTF(2, 3);
42  int vformat(const char* fmt, va_list ap);
43 
44  /**
45  * 从文件中读取数据
46  * @param buf {void*} 缓存地址
47  * @param len {size_t} buf 大小
48  * @return {int} 读取的数据长度, -1: 表示读结束或读失败或输入参数错误,
49  * 应该关闭该文件对象, > 0: 表示成功
50  */
51  int read(void* buf, size_t len);
52 
53  /**
54  * 取得本队列文件的键值, 该值即是队列文件的部分文件名(不含路径,
55  * 扩展名)
56  * @return {const char*} 队列文件键值
57  */
58  const char* key(void) const
59  {
60  return m_partName;
61  }
62 
63  /**
64  * 获得队列文件的访问全路径
65  * @return {const char*}
66  */
67  const char* get_filePath(void) const
68  {
69  return m_filePath.c_str();
70  }
71 
72  /**
73  * 获得队列文件的根路径部分(不含队列目录)
74  * @return {const char*}
75  */
76  const char* get_home(void) const
77  {
78  return m_home;
79  }
80 
81  /**
82  * 获得该队列文件的队列名
83  * @return {const char*} 队列名称
84  */
85  const char* get_queueName(void) const
86  {
87  return m_queueName;
88  }
89 
90  /**
91  * 获得队列子目录
92  * @return {const char*} 队列子目录名
93  */
94  const char* get_queueSub(void) const
95  {
96  return m_queueSub;
97  }
98 
99  /**
100  * 获得该队列文件的扩展名
101  * @return {const char*} 扩展名称
102  */
103  const char* get_extName(void) const
104  {
105  return m_extName;
106  }
107 
108  /**
109  * 获得已经写入的数据大小尺寸
110  * @return {size_t}
111  */
112  size_t get_fileSize() const
113  {
114  return nwriten_;
115  }
116 
117 private:
118  friend class queue_manager;
119 
120  ~queue_file();
121 
122  /**
123  * 创建新的队列文件, 创建完毕后会自动创建该文件的加锁对象
124  * 可以直接调用该文件的 lock()/unlock()
125  * @param home {const char*} 队列文件所在根路径
126  * @param queueName {const char*} 队列名
127  * @param extName {const char*} 队列文件扩展名
128  * @param width {unsigned} 队列二级目录的个数
129  * @return {bool} 创建新队列文件是否成功, 如果返回 false 则说明
130  * 输入的 path 或 extName 非法
131  */
132  bool create(const char* home, const char* queueName,
133  const char* extName, unsigned width);
134 
135  /**
136  * 打开已经存在的队列文件, 打开后会自动创建该文件的加锁对象,
137  * 可以直接调用该文件的 lock()/unlock()
138  * @param filePath {const char*} 队列文件路径
139  * @return {bool} 打开队列文件是否成功
140  */
141  bool open(const char* filePath);
142  bool open(const char* home, const char* queueName, const char* queueSub,
143  const char* partName, const char* extName);
144 
145  /**
146  * 关闭当前文件句柄
147  */
148  void close();
149 
150  /**
151  * 从磁盘上删除本队列文件
152  * @return {bool} 删除是否成功
153  */
154  bool remove();
155 
156  /**
157  * 将队列文件从当前队列中移至目标队列中
158  * @param queueName {const char*} 目标队列名称
159  * @param extName {const char*} 目标扩展名称
160  * @return {bool} 移动文件是否成功
161  */
162  bool move_file(const char* queueName, const char* extName);
163 
164  /**
165  * 设置队列名
166  * @param queueName {const char*} 队列名称
167  */
168  void set_queueName(const char* queueName);
169 
170  /**
171  * 设置队列文件的扩展名
172  */
173  void set_extName(const char* extName);
174 
175  /**
176  * 对当前队列文件对象加锁(包括互斥锁及文件锁)
177  * @return {bool} 加锁是否成功
178  */
179  bool lock(void);
180 
181  /**
182  * 对当前队列文件对象解锁(包括互斥锁及文件锁)
183  * @return {bool} 解锁是否成功
184  */
185  bool unlock(void);
186 
187 private:
188  // 文件流对象
189  fstream* m_fp;
190 
191  // 队列文件相对于队列根目录的全路径名
192  string m_filePath;
193 
194  // 队列文件的根路径
195  char m_home[MAXPATH255];
196 
197  // 队列名称
198  char m_queueName[32];
199 
200  // 队列下的子目录
201  char m_queueSub[32];
202 
203  // 队列文件名, 不包括路径, 也不包括文件的扩展名
204  char m_partName[MAXPATH255];
205 
206  // 队列文件的扩展名
207  char m_extName[32];
208 
209  // 加锁对象
210  locker m_locker;
211 
212  // 当前文件是否已经被加锁了
213  bool m_bLocked;
214 
215  // 文件锁是否已经打开了
216  bool m_bLockerOpened;
217 
218  // 已经写入的文件尺寸大小
219  size_t nwriten_;
220 };
221 
222 } // namespace acl
#define ACL_CPP_PRINTF(format_idx, arg_idx)
Definition: atomic.hpp:75
size_t get_fileSize() const
Definition: queue_file.hpp:112
ACL_API ACL_VSTRING const char * format
Definition: acl_vstring.h:239
const char * get_extName(void) const
Definition: queue_file.hpp:103
const char * get_home(void) const
Definition: queue_file.hpp:76
const char * get_queueName(void) const
Definition: queue_file.hpp:85
const char * get_filePath(void) const
Definition: queue_file.hpp:67
const char * key(void) const
Definition: queue_file.hpp:58
const char * get_queueSub(void) const
Definition: queue_file.hpp:94
ACL_API void const char * fmt
Definition: acl_aio.h:771
#define ACL_CPP_API