diff --git a/include/dap_file_utils.h b/include/dap_file_utils.h index 81e22d8a51093afba5584525fd9e04253d6b0e16..13830811a2b4b4e87cf45bed67a07be7ee3bccba 100755 --- a/include/dap_file_utils.h +++ b/include/dap_file_utils.h @@ -22,12 +22,16 @@ along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. */ #include <stdbool.h> +#include "dap_list.h" +#include <dirent.h> #ifndef _DAP_FILE_UTILS_H_ #define _DAP_FILE_UTILS_H_ #ifdef _WIN32 +#include <Windows.h> + /* On Win32, the canonical directory separator is the backslash, and * the search path separator is the semicolon. Note that also the * (forward) slash works as directory separator. @@ -85,4 +89,12 @@ char* dap_path_get_basename(const char *a_file_name); bool dap_path_is_absolute(const char *a_file_name); char* dap_path_get_dirname(const char *a_file_name); +/** + * Get list of subdirectories + * + * @a_path_name directory path. + * @return dap_list_t type variable that contains a list of subdirectories. + */ +dap_list_t *dap_get_subs(const char *a_path_name); + #endif // _FILE_UTILS_H_ diff --git a/src/dap_file_utils.c b/src/dap_file_utils.c index 2ad83ad15c39b8f9418ee30a9790930e3db1bf91..893b601e9336a078aa8899d151bd66d4afba4f95 100755 --- a/src/dap_file_utils.c +++ b/src/dap_file_utils.c @@ -368,3 +368,34 @@ char* dap_path_get_dirname(const char *a_file_name) return l_base; } + +dap_list_t *dap_get_subs(const char *a_path_dir){ + dap_list_t *list = dap_list_alloc(); +#ifdef _WIN32 + size_t m_size = strlen(a_path_dir); + char *m_path = DAP_NEW_SIZE(char, m_size + 2); + memcpy(m_path, a_path_dir, m_size); + m_path[m_size] = '*'; + m_path[m_size + 1] = '\0'; + WIN32_FIND_DATA info_file; + HANDLE h_find_file = FindFirstFileA(m_path, &info_file); + while (FindNextFileA(h_find_file, &info_file)){ + if (info_file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY){ + dap_list_append(list, info_file.cFileName); + } + } + FindClose(h_find_file); + DAP_FREE(m_path); +#else + DIR *dir = opendir(a_path_dir); + struct dirent *entry = readdir(dir); + while (entry != NULL){ + if (strcmp(entry->d_name, "..") != 0 && strcmp(entry->d_name, ".") != 0 && entry->d_type == DT_DIR){ + dap_list_append(list, entry->d_name); + } + entry = readdir(dir); + } + closedir(dir); +#endif + return list; +}