acl  3.5.3.0
acl_scan_dir.h
浏览该文件的文档.
1 #ifndef ACL_SCAN_DIR_INCLUDE_H
2 #define ACL_SCAN_DIR_INCLUDE_H
3 
4 #include <sys/stat.h>
5 
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
9 
10 #include "acl_define.h"
11 /**
12  * 目录扫描句柄类型定义
13  */
14 typedef struct ACL_SCAN_DIR ACL_SCAN_DIR;
15 
16 /**
17  * 目录扫描过程中用户可以设置的回调函数类型定义
18  * @param scan {ACL_SCAN_DIR*} 目录扫描指针
19  * @param ctx {void*} 用户参数指针
20  */
21 typedef int (*ACL_SCAN_DIR_FN)(ACL_SCAN_DIR *scan, void *ctx);
22 
23 /**
24  * 目录扫描过程中,如果遇到空目录且用户设置了自动删除空目录标记,则回调此方法
25  * 通知用户删除指定的空目录
26  * @param scan {ACL_SCAN_DIR*} 目录扫描指针
27  * @param ctx {void*} 用户参数指针
28  */
29 typedef int (*ACL_SCAN_RMDIR_FN)(ACL_SCAN_DIR *scan, const char *path, void *ctx);
30 
31 /**
32  * 打开扫描路径, 为整个 acl_scan_dir 函数库的初始化函数
33  * @param path {const char*} 要打开的路径名称
34  * @param recursive {int} 是否需要递归扫描子目录
35  * @return {ACL_SCAN_DIR*} NULL: Err; != NULL, OK
36  */
37 ACL_API ACL_SCAN_DIR *acl_scan_dir_open(const char *path, int recursive);
38 
39 /**
40  * 打开扫描路径, 为整个 acl_scan_dir 函数库的初始化函数
41  * @param path {const char*} 要打开的路径名称
42  * @param flags {unsigned} 标志位, 见 ACL_SCAN_FLAG_XXX
43  * @return {ACL_SCAN_DIR*} NULL: Err; != NULL, OK
44  */
45 ACL_API ACL_SCAN_DIR *acl_scan_dir_open2(const char *path, unsigned flags);
46 #define ACL_SCAN_FLAG_RECURSIVE (1 << 0) /* 是否做递归扫描 */
47 #define ACL_SCAN_FLAG_RMDIR (1 << 1) /* 是否自动删除空目录 */
48 
49 /**
50  * 关闭扫描句柄
51  * @param scan {ACL_SCAN_DIR*} 类型指针
52  */
53 ACL_API void acl_scan_dir_close(ACL_SCAN_DIR *scan);
54 
55 /**
56  * 将目录扫描句柄的与统计信息相关的变量置0
57  * @param scan {ACL_SCAN_DIR*} 类型指针
58  */
59 ACL_API void acl_scan_dir_reset(ACL_SCAN_DIR *scan);
60 
61 /**
62  * 通过此接口设置扫描句柄的回调函数、参数等,当最后的一个控制标志
63  * 为 ACL_SCAN_CTL_END 时表示控制参数列表结束
64  * @param scan {ACL_SCAN_DIR*} 类型指针
65  * @param name {int} 第一个控制项, ACL_SCAN_CTL_XXX
66  */
67 ACL_API void acl_scan_dir_ctl(ACL_SCAN_DIR *scan, int name, ...);
68 #define ACL_SCAN_CTL_END 0 /**< 控制结束标志 */
69 #define ACL_SCAN_CTL_FN 1 /**< 设置 ACL_SCAN_DIR_FN 标志 */
70 #define ACL_SCAN_CTL_CTX 2 /**< 设置用户参数 */
71 #define ACL_SCAN_CTL_RMDIR_FN 3 /**< 设置删除目录回调函数 */
72 
73 /**
74  * 获得当前状态下的相对路径(相对于程序调用 acl_scan_dir_open
75  * 函数时的程序运行路径)
76  * @param scan {ACL_SCAN_DIR*} 类型指针
77  * @return {const char*} 相对路径, == NULL: err; != NULL, OK
78  */
79 ACL_API const char *acl_scan_dir_path(ACL_SCAN_DIR *scan);
80 
81 /**
82  * 当前所扫描的文件名,如果扫描的对象不是文件,则返回 "\0"
83  * @param scan {ACL_SCAN_DIR*} 类型指针
84  * @return {const char*} 文件名
85  */
86 ACL_API const char *acl_scan_dir_file(ACL_SCAN_DIR *scan);
87 
88 /**
89  * 当前已经扫描的目录总个数
90  * @param scan {ACL_SCAN_DIR*}
91  * @return {unsigned} 目录总个数
92  */
93 ACL_API unsigned acl_scan_dir_ndirs(ACL_SCAN_DIR *scan);
94 
95 /**
96  * 当前已经扫描的文件总个数
97  * @param scan {ACL_SCAN_DIR*}
98  * @return {unsigned} 文件总个数
99  */
100 ACL_API unsigned acl_scan_dir_nfiles(ACL_SCAN_DIR *scan);
101 
102 /**
103  * 当前已经扫描的文件大小总和
104  * @param scan {ACL_SCAN_DIR*}
105  * @return {acl_int64} -1: Error; >= 0: Ok
106  */
107 ACL_API acl_int64 acl_scan_dir_nsize(ACL_SCAN_DIR *scan);
108 
109 /**
110  * 取得当前扫描到的文件或目录的属性信息,类似于标准的 stat() 函数
111  * @param scan {ACL_SCAN_DIR*} 类型指针
112  * @param sbuf {struct acl_stat*} 类型指针
113  * @return {int} 0: Ok, -1: Error
114  */
115 ACL_API int acl_scan_stat(ACL_SCAN_DIR *scan, struct acl_stat *sbuf);
116 
117 /**
118  * 取得当前正在扫描的目录节点的属性信息,该 API 不同于 acl_scan_stat
119  * @param scan {ACL_SCAN_DIR*} 类型指针
120  * @param sbuf {struct acl_stat*} 类型指针
121  * @return {int} 0: Ok, -1: Error
122  */
123 ACL_API int acl_scan_dir_stat(ACL_SCAN_DIR *scan, struct acl_stat *sbuf);
124 
125 /**
126  * 目录是否扫描完毕
127  * @param scan {ACL_SCAN_DIR*} 类型指针
128  * @return {int} 0: 表示未扫描完毕; !=0: 表示扫描完毕
129  */
130 ACL_API int acl_scan_dir_end(ACL_SCAN_DIR *scan);
131 
132 /**
133  * 将需要进行扫描的相对路径压栈
134  * @param scan {ACL_SCAN_DIR*} 类型指针
135  * @param path {const char*} 需要压栈的相对路径
136  * @return {int} 0: OK; -1: Err
137  */
138 ACL_API int acl_scan_dir_push(ACL_SCAN_DIR *scan, const char *path);
139 
140 /**
141  * 弹出下一个路径
142  * @param scan {ACL_SCAN_DIR*} 类型指针
143  * @return {ACL_SCAN_DIR*} 返回堆栈中的下一个对象, == NULL: 结束; != NULL, OK
144  */
146 
147 /**
148  * 获得 scan 当前所在路径中下一个路径名或文件名, 注意,该函数内部不会递归扫描,
149  * 即 acl_scan_dir_open 中的参数 recursive 对该函数无效
150  * 1、 ".." 与 "." 不包含在内
151  * 2、 仅返回名称, 不包括路径, 路径可以由 acl_scan_dir_path 获得
152  * @param scan {ACL_SCAN_DIR*} 指针地址
153  * @return {const char*} 为目录名称或文件名称, != NULL: OK; == NULL, 扫描完毕
154  */
155 ACL_API const char *acl_scan_dir_next(ACL_SCAN_DIR *scan);
156 
157 /**
158  * 获得下一个文件名(不包含路径名, 相对路径名可以通过 acl_scan_dir_path 获得),
159  * 该函数内部支持递归扫描目录功能, acl_scan_dir_open 中的参数 recursive 对该函数有效
160  * @param scan {ACL_SCAN_DIR*} 类型指针
161  * @return {const char*} 返回下一个扫描的文件名: !NULL, OK; NULL 扫描完毕,应结束扫描
162  */
163 ACL_API const char *acl_scan_dir_next_file(ACL_SCAN_DIR *scan);
164 
165 /**
166  * 获得下一个目录名(不包含路径名, 相对路径名可以通过 acl_scan_dir_path 获得),
167  * 该函数内部支持递归扫描目录功能, acl_scan_dir_open 中的参数 recursive 对该函数有效
168  * @param scan {ACL_SCAN_DIR*} 类型指针
169  * @return {const char*} 返回下一个扫描的目录名: !NULL, OK; NULL 扫描完毕, 应结束扫描
170  */
171 ACL_API const char *acl_scan_dir_next_dir(ACL_SCAN_DIR *scan);
172 
173 /**
174  * 获得下一个目录名或文件名(不包含路径名, 相对路径名可以通过 acl_scan_dir_path 获得),
175  * 该函数内部支持递归扫描目录功能, acl_scan_dir_open 中的参数 recursive 对该函数有效
176  * @param scan {ACL_SCAN_DIR*} 类型指针
177  * @param is_file {int*} 当返回结果非空时,该地址存储的值表示所扫描到的是否是
178  * 文件,如果为 true 则为文件,否则为目录
179  * @return {const char*} 返回下一个扫描的目录名或文件名: !NULL, OK; NULL 扫描完毕,
180  * 应结束扫描
181  */
182 ACL_API const char *acl_scan_dir_next_name(ACL_SCAN_DIR *scan, int *is_file);
183 
184 /**
185  * 取得当前目录下所占磁盘空间大小(以字节计算)
186  * 该函数内部支持递归扫描目录功能, acl_scan_dir_open 中的参数 recursive 对该函数有效
187  * @param scan {ACL_SCAN_DIR*} 打开目录时的扫描句柄
188  * @param nfile {int*} 扫描完后记录所扫描的文件总数
189  * @param ndir {int*} 扫描完后记录所扫描的目录总数
190  * @return {acl_int64} -1: Error; >= 0: Ok
191  */
192 ACL_API acl_int64 acl_scan_dir_size2(ACL_SCAN_DIR *scan, int *nfile, int *ndir);
193 
194 /**
195  * 取得当前目录下所占磁盘空间大小(以字节计算)
196  * @param pathname {const char*} 目录路径名
197  * @param recursive {int} 是否要递归扫描该目录下的所有子目录
198  * @param nfile {int*} 扫描完后记录所扫描的文件总数
199  * @param ndir {int*} 扫描完后记录所扫描的目录总数
200  * @return {acl_int64} -1: Error, >= 0: Ok
201  */
202 ACL_API acl_int64 acl_scan_dir_size(const char *pathname, int recursive,
203  int *nfile, int *ndir);
204 
205 /**
206  * 删除所给路径下所有的文件及目录
207  * @param nfile {int*} 扫描完后记录所扫描的文件总数
208  * @param ndir {int*} 扫描完后记录所扫描的目录总数
209  * 该函数内部支持递归扫描目录功能, acl_scan_dir_open 中的参数 recursive 对该函数有效
210  * @param scan {ACL_SCAN_DIR*} 打开目录时的扫描句柄
211  * @return {acl_int64} >= 0: 实际删除的文件数与目录数的尺寸大小之和(字节); < 0: 出错.
212  */
213 ACL_API acl_int64 acl_scan_dir_rm2(ACL_SCAN_DIR *scan, int *nfile, int *ndir);
214 
215 /**
216  * 删除所给路径下所有的文件及目录
217  * @param pathname {const char*} 路径名
218  * @param recursive {int} 是否递归删除所有子目录及子目录下的文件
219  * @param ndir {int*} 若该参数非空,过程结束后 *ndir 等于总共删除的目录数目
220  * @param nfile {int*} 若该参数非空,过程结束后 *nfile 等于总共删除的文件数目
221  * @return {acl_int64} >= 0: 实际删除的文件数与目录数的尺寸大小之和(字节); < 0: 出错.
222  */
223 ACL_API acl_int64 acl_scan_dir_rm(const char *pathname, int recursive,
224  int *ndir, int *nfile);
225 
226 #ifdef __cplusplus
227 }
228 #endif
229 
230 #endif
231 
232 
ACL_API const char * acl_scan_dir_path(ACL_SCAN_DIR *scan)
struct ACL_SCAN_DIR ACL_SCAN_DIR
Definition: acl_scan_dir.h:14
ACL_API acl_int64 acl_scan_dir_size(const char *pathname, int recursive, int *nfile, int *ndir)
HTTP_API void const char * name
Definition: lib_http.h:620
ACL_API unsigned acl_scan_dir_nfiles(ACL_SCAN_DIR *scan)
ACL_API ACL_SCAN_DIR * acl_scan_dir_open(const char *path, int recursive)
int(* ACL_SCAN_DIR_FN)(ACL_SCAN_DIR *scan, void *ctx)
Definition: acl_scan_dir.h:21
ACL_API int acl_scan_dir_push(ACL_SCAN_DIR *scan, const char *path)
ACL_API ACL_SCAN_DIR * acl_scan_dir_open2(const char *path, unsigned flags)
ACL_API const char * acl_scan_dir_next_dir(ACL_SCAN_DIR *scan)
ACL_API const char * acl_scan_dir_next(ACL_SCAN_DIR *scan)
ACL_API int acl_scan_stat(ACL_SCAN_DIR *scan, struct acl_stat *sbuf)
ACL_API int acl_scan_dir_stat(ACL_SCAN_DIR *scan, struct acl_stat *sbuf)
ACL_API acl_int64 acl_scan_dir_size2(ACL_SCAN_DIR *scan, int *nfile, int *ndir)
ACL_API const char * acl_scan_dir_next_file(ACL_SCAN_DIR *scan)
ACL_API void acl_scan_dir_reset(ACL_SCAN_DIR *scan)
ACL_API acl_int64 acl_scan_dir_nsize(ACL_SCAN_DIR *scan)
ACL_API acl_int64 acl_scan_dir_rm2(ACL_SCAN_DIR *scan, int *nfile, int *ndir)
int(* ACL_SCAN_RMDIR_FN)(ACL_SCAN_DIR *scan, const char *path, void *ctx)
Definition: acl_scan_dir.h:29
ACL_API const char * acl_scan_dir_file(ACL_SCAN_DIR *scan)
ACL_API void acl_scan_dir_close(ACL_SCAN_DIR *scan)
ACL_API const char * acl_scan_dir_next_name(ACL_SCAN_DIR *scan, int *is_file)
ACL_API unsigned acl_scan_dir_ndirs(ACL_SCAN_DIR *scan)
ACL_API ACL_SCAN_DIR * acl_scan_dir_pop(ACL_SCAN_DIR *scan)
ACL_API acl_int64 acl_scan_dir_rm(const char *pathname, int recursive, int *ndir, int *nfile)
ACL_API void acl_scan_dir_ctl(ACL_SCAN_DIR *scan, int name,...)
ACL_API int acl_scan_dir_end(ACL_SCAN_DIR *scan)