- 论坛徽章:
- 2
|
本帖最后由 cobras 于 2014-07-09 16:00 编辑
随手写个通用版的递归目录函数。使用方式超简单。见下面的例子。
- #include <windows.h>
- #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)
- {
- WIN32_FIND_DATA find_data;
- HANDLE hFind;
- int name_len;
- int full_len;
- if (path_len > 0 && path_buf[path_len - 1] == PATH_SPLITTER) {
- if (path_len + 4 <= buff_len) {
- strncpy(path_buf + path_len, "*.*", 4);
- ZeroMemory(&find_data, sizeof(find_data));
- hFind = FindFirstFile(path_buf, &find_data);
- if (hFind != INVALID_HANDLE_VALUE) {
- do {
- if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
- if (strcmp(find_data.cFileName, ".") == 0
- || strcmp(find_data.cFileName, "..") == 0) {
- continue;
- }
- }
- name_len = strlen(find_data.cFileName);
- if (path_len + name_len <= buff_len) {
- strncpy(path_buf + path_len, find_data.cFileName, name_len);
- full_len = path_len + name_len;
- if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
- if (full_len + 2 <= buff_len) {
- path_buf[full_len++] = PATH_SPLITTER;
- path_buf[full_len] = '\0';
- }else {
- FindClose(hFind);
- return -2; /* ERROR: BUFFER OVERFLOW */
- }
- }else {
- if (full_len + 1 <= buff_len) {
- path_buf[full_len] = '\0';
- }else {
- FindClose(hFind);
- return -2; /* ERROR: BUFFER OVERFLOW */
- }
- }
- }else {
- FindClose(hFind);
- return -2; /* ERROR: BUFFER OVERFLOW */
- }
- if ((*enum_dir_func)(data, path_buf, full_len, buff_len) == -1) {
- FindClose(hFind);
- return -4; /* ERROR: USER BREAK */
- }
- }while (FindNextFile(hFind, &find_data));
- FindClose(hFind);
- return 0;
- }
- return -3; /* ERROR: UNKNOWN PATH */
- }
- return -2; /* ERROR: BUFFER OVERFLOW */
- }
- return -1; /* ERROR: INVALID PARAMETERS */
- }
- #include <stdio.h>
- int list_file_func(int *data, char *path_buf, int path_len, int buff_len)
- {
- ++ *data;
- printf("%.*s\n", path_len, path_buf);
- if (path_len > 0 && path_buf[path_len - 1] == PATH_SPLITTER) {
- enum_dir(path_buf, path_len, buff_len, list_file_func, data);
- }
- return 0;
- }
- int main(void)
- {
- char buff[MAX_PATH];
- int path_len;
- int count;
- strcpy(buff, "c:\\");
- path_len = strlen(buff);
- count = 0;
- enum_dir(buff, path_len, MAX_PATH, list_file_func, &count);
- printf("Total %d nodes\n", count);
- return 0;
- }
复制代码 |
|