acl  3.5.3.0
scan_dir.hpp
浏览该文件的文档.
1 #pragma once
2 #include "noncopyable.hpp"
3 
4 struct ACL_SCAN_DIR;
5 
6 namespace acl
7 {
8 
9 class string;
10 
12 {
13 public:
14  scan_dir(void);
15  virtual ~scan_dir(void);
16 
17  /**
18  * 打开目录
19  * @param path {const char*} 目录路径,非空指针
20  * @param recursive {bool} 是否允许递归扫描目录
21  * @param rmdir_on {bool} 当目录为空时,是否需要删除该空目录
22  * @return {bool} 打开目录是否成功
23  */
24  bool open(const char* path, bool recursive = true, bool rmdir_on = false);
25 
26  /**
27  * 虚方法,当需要删除空目录时,子类可以实现此虚方法来删除传入的目录,
28  * 本虚方法内部会自动调用 rmdir 删除空目录
29  * @param path {const char*} 需要被删除的空目录
30  * @return {bool} 删除目录是否成功
31  */
32  virtual bool rmdir_callback(const char* path);
33 
34  /**
35  * 关闭目录,同时释放内部资源
36  */
37  void close(void);
38 
39  /**
40  * 扫描下一个文件(遇到目录会自动跳过),当在 open 指定了允许递归扫描选项
41  * (即 recursive = true),则该函数会递归扫描所打开目录的所有子目录
42  * @param full {bool} 是否需要返回文件全路径
43  * @return {const char*} 非 NULL 表示所扫描到的文件名,否则表示扫描完毕
44  * 或目录还未打开
45  */
46  const char* next_file(bool full = false);
47 
48  /**
49  * 扫描下一个目录(遇到文件或 "." 或 ".." 会跳过),当在 open 指定允许了
50  * 允许递归扫描项(即 recursive = true),则该函数会递归扫描所开目录的所
51  * 有子目录
52  * @param full {bool} 是否需要返回目录全路径
53  * @return {const char*} 非 NULL 表示所扫描到的目录名,否则表示扫描完
54  * 毕或目录还未打开
55  */
56  const char* next_dir(bool full = false);
57 
58  /**
59  * 扫描下一个目录或文件,当在 open 指定了允许递归扫描项(即 resursive
60  * = true),则该函数会递归扫描所打开目录的所有子目录及文件
61  * @param full {bool} 是否需要返回目录或文件的全路径,如果为 true 则返
62  * 回全路径,否则只返回文件名或目录名且都不含路径
63  * @param is_file {bool*} 当返回结果非空时,该地址存储的值表示所扫描到
64  * 的是否是文件,如果为 true 则为文件,否则为目录
65  * @return {const char*} 非 NULL 表示所扫描到的目录名或文件名,否则表
66  * 示扫描完毕或目录还未打开
67  */
68  const char* next(bool full = false, bool* is_file = NULL);
69 
70  /**
71  * 获得当前扫描过程所在的目录路径,返回的路径尾部不包含路径分隔符 '/'
72  * 或 '\\' (win32),如对于路径:/home/zsx/,则会返回 /home/zsx,如果
73  * 路径为根路径:/ 则该 '/' 将会保留;在 _WIN32 下,返回类似于
74  * C:\Users\zsx 的路径
75  * @return {const char*} 当目录打开时该函数返回非空指针,否则返回 NULL
76  */
77  const char* curr_path();
78 
79  /**
80  * 获得当前程序扫描过程所扫到的文件名
81  * @param full {bool} 是否需要同时返回文件全路径
82  * @return {bool} 如果目录未找开或当前扫描的不是文件,则返回 NULL
83  */
84  const char* curr_file(bool full = false);
85 
86  /**
87  * 返回当前已经扫描的目录的个数
88  * @return {size_t}
89  */
90  size_t dir_count() const;
91 
92  /**
93  * 返回当前已经扫描的文件的个数
94  * @return {size_t}
95  */
96  size_t file_count() const;
97 
98 #if defined(_WIN32) || defined(_WIN64)
99  /**
100  * 获得当前已经扫描的文件及目录大小的总和
101  * @return {acl_uint64}
102  */
103  unsigned __int64 scaned_size() const;
104 
105  /**
106  * open 成功后调用本函数统计根目录下所有文件及目录大小的总和
107  * @param nfiles {int*} 非空时存储被删除的文件个数
108  * @param ndirs {int*} 非空时存储被删除的目录个数
109  * @return {acl_uint64} 根目录下所有文件及目录大小的总和
110  */
111  unsigned __int64 all_size(int* nfiles = NULL, int* ndirs = NULL) const;
112 
113  /**
114  * 根目录下所有文件及目录大小的总和
115  * @param path {const char*} 需要被删除的根目录
116  * @param recursive {bool} 是否递归扫描所有目录
117  * @param nfiles {int*} 非空时存储被删除的文件个数
118  * @param ndirs {int*} 非空时存储被删除的目录个数
119  * @return {acl_uint64} 根目录下所有文件及目录大小的总和
120  */
121  static unsigned __int64 all_size(const char* path, bool recursive = true,
122  int* nfiles = NULL, int* ndirs = NULL);
123 
124  /**
125  * open 成功后调用本函数删除根目录下的所有文件及目录
126  * @param nfiles {int*} 非空时存储被删除的文件个数
127  * @param ndirs {int*} 非空时存储被删除的目录个数
128  * @return {acl_unint64} 删除的所有文件及目录大小总和(字节单位)
129  */
130  unsigned __int64 remove_all(int* nfiles = NULL, int* ndirs = NULL) const;
131 
132  /**
133  * 删除根目录下的所有文件及目录
134  * @param path {const char*} 需要被删除的根目录
135  * @param recursive {bool} 是否递归扫描所有目录
136  * @param nfiles {int*} 非空时存储被删除的文件个数
137  * @param ndirs {int*} 非空时存储被删除的目录个数
138  * @return {acl_unint64} 删除的所有文件及目录大小总和(字节单位)
139  */
140  static unsigned __int64 remove_all(const char* path, bool recursive = true,
141  int* nfiles = NULL, int* ndirs = NULL);
142 #else
143  unsigned long long scaned_size() const;
144  unsigned long long all_size(int* nfiles = NULL, int* ndirs = NULL) const;
145  static unsigned long long all_size(const char* path, bool recursive = true,
146  int* nfiles = NULL, int* ndirs = NULL);
147  unsigned long long remove_all(int* nfiles = NULL, int* ndirs = NULL) const;
148  static unsigned long long remove_all(const char* path, bool recursive = true,
149  int* nfiles = NULL, int* ndirs = NULL);
150 #endif
151 
152  /**
153  * 获得当前程序运行的路径
154  * @param out {string&} 存储结果
155  * @return {bool} 是否成功获得当前程序运行路径
156  */
157  static bool get_cwd(string& out);
158 
159 public:
161  {
162  return scan_;
163  }
164 
165  /**
166  * 设置回调方法,用来删除空目录
167  * @param fn {int (*)(ACL_SCAN_DIR*, const char*, void*)}
168  * @param ctx {void*}
169  */
170  void set_rmdir_callback(int (*fn)(ACL_SCAN_DIR*, const char*, void*), void* ctx);
171 
172 private:
173  char* path_;
174  ACL_SCAN_DIR* scan_;
175  string* path_buf_;
176  string* file_buf_;
177 
178  static int rmdir_def(ACL_SCAN_DIR* scan, const char* path, void* ctx);
179 };
180 
181 } // namespace acl
struct ACL_SCAN_DIR ACL_SCAN_DIR
Definition: acl_scan_dir.h:14
#define ACL_CPP_API
ACL_SCAN_DIR * get_scan_dir(void) const
Definition: scan_dir.hpp:160