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;
+}