- 论坛徽章:
- 2
|
分享一个本地查找文件的工具的实现例子。需要使用前面我分享的2个函数。
- #define PATH_SPLITTER '\\'
- int enum_dir(char *path_buf, int path_len, int buff_len, int (*enum_dir_func)(void *data, char *path_buf, int path_len, int buff_len), void *data);
- int nstr_match(const char *text, int text_len, const char *rules, int rules_len);
- #include <stdio.h>
- #include <string.h>
- #define MAX_PATH 260
- int nstr_rchr(const char *s, int off, int lmt, int c)
- {
- for (; off < lmt; --lmt) {
- if (s[lmt - 1] == c) {
- return lmt;
- }
- }
- return -1;
- }
- struct list_param
- {
- const char *rules;
- int count;
- };
- int list_file_func(struct list_param *param, char *path_buf, int path_len, int buff_len)
- {
- int name_off;
- if (path_len > 0 && path_buf[path_len - 1] == PATH_SPLITTER) {
- enum_dir(path_buf, path_len, buff_len, list_file_func, param);
- }else {
- name_off = nstr_rchr(path_buf, 0, path_len, PATH_SPLITTER);
- if (name_off == -1) {
- name_off = 0;
- }
- if (nstr_match(path_buf + name_off, path_len - name_off, param->rules, strlen(param->rules)) == 0) {
- ++ param->count;
- printf("%.*s\n", path_len, path_buf);
- }
- }
- return 0;
- }
- int main(void)
- {
- char buff[MAX_PATH];
- struct list_param param;
- int path_len;
- param.rules = "*.c";
- param.count = 0;
- strcpy(buff, "..\\");
- path_len = strlen(buff);
- enum_dir(buff, path_len, MAX_PATH, list_file_func, ¶m);
- printf("Total %d files\n", param.count);
- return 0;
- }
复制代码 |
|