diff --git a/parser/output/raylib_api.json b/parser/output/raylib_api.json
index 423b55282..7e9ad9c12 100644
--- a/parser/output/raylib_api.json
+++ b/parser/output/raylib_api.json
@@ -4523,7 +4523,7 @@
},
{
"name": "LoadDirectoryFilesEx",
- "description": "Load directory filepaths with extension filtering and recursive directory scan",
+ "description": "Load directory filepaths with extension filtering and recursive directory scan. Use "/DIR" in the filter string to include directories in the result",
"returnType": "FilePathList",
"params": [
{
diff --git a/parser/output/raylib_api.lua b/parser/output/raylib_api.lua
index 0aad16644..5a644a3ad 100644
--- a/parser/output/raylib_api.lua
+++ b/parser/output/raylib_api.lua
@@ -4076,7 +4076,7 @@ return {
},
{
name = "LoadDirectoryFilesEx",
- description = "Load directory filepaths with extension filtering and recursive directory scan",
+ description = "Load directory filepaths with extension filtering and recursive directory scan. Use "/DIR" in the filter string to include directories in the result",
returnType = "FilePathList",
params = {
{type = "const char *", name = "basePath"},
diff --git a/parser/output/raylib_api.txt b/parser/output/raylib_api.txt
index 55420d158..19181328f 100644
--- a/parser/output/raylib_api.txt
+++ b/parser/output/raylib_api.txt
@@ -1722,7 +1722,7 @@ Function 137: LoadDirectoryFiles() (1 input parameters)
Function 138: LoadDirectoryFilesEx() (3 input parameters)
Name: LoadDirectoryFilesEx
Return type: FilePathList
- Description: Load directory filepaths with extension filtering and recursive directory scan
+ Description: Load directory filepaths with extension filtering and recursive directory scan. Use "/DIR" in the filter string to include directories in the result
Param[1]: basePath (type: const char *)
Param[2]: filter (type: const char *)
Param[3]: scanSubdirs (type: bool)
diff --git a/parser/output/raylib_api.xml b/parser/output/raylib_api.xml
index 3f8f65b13..f73e9241b 100644
--- a/parser/output/raylib_api.xml
+++ b/parser/output/raylib_api.xml
@@ -1081,7 +1081,7 @@
-
+
diff --git a/src/raylib.h b/src/raylib.h
index 84f136355..a1514e32c 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -1126,7 +1126,7 @@ RLAPI bool ChangeDirectory(const char *dir); // Change work
RLAPI bool IsPathFile(const char *path); // Check if a given path is a file or a directory
RLAPI bool IsFileNameValid(const char *fileName); // Check if fileName is valid for the platform/OS
RLAPI FilePathList LoadDirectoryFiles(const char *dirPath); // Load directory filepaths
-RLAPI FilePathList LoadDirectoryFilesEx(const char *basePath, const char *filter, bool scanSubdirs); // Load directory filepaths with extension filtering and recursive directory scan
+RLAPI FilePathList LoadDirectoryFilesEx(const char *basePath, const char *filter, bool scanSubdirs); // Load directory filepaths with extension filtering and recursive directory scan. Use "/DIR" in the filter string to include directories in the result
RLAPI void UnloadDirectoryFiles(FilePathList files); // Unload filepaths
RLAPI bool IsFileDropped(void); // Check if a file has been dropped into window
RLAPI FilePathList LoadDroppedFiles(void); // Load dropped filepaths
diff --git a/src/rcore.c b/src/rcore.c
index 44dfd746f..50e26423b 100644
--- a/src/rcore.c
+++ b/src/rcore.c
@@ -251,6 +251,10 @@ unsigned int __stdcall timeEndPeriod(unsigned int uPeriod);
#define MAX_AUTOMATION_EVENTS 16384 // Maximum number of automation events to record
#endif
+#ifndef FILTER_FOLDER
+ #define FILTER_FOLDER "/DIR" // Filter string used in ScanDirectoryFiles, ScanDirectoryFilesRecursively and LoadDirectoryFilesEx to include directories in the result array
+#endif
+
// Flags operation macros
#define FLAG_SET(n, f) ((n) |= (f))
#define FLAG_CLEAR(n, f) ((n) &= ~(f))
@@ -3339,10 +3343,21 @@ static void ScanDirectoryFiles(const char *basePath, FilePathList *files, const
if (filter != NULL)
{
- if (IsFileExtension(path, filter))
+ if (IsPathFile(path))
{
- strcpy(files->paths[files->count], path);
- files->count++;
+ if (IsFileExtension(path, filter))
+ {
+ strcpy(files->paths[files->count], path);
+ files->count++;
+ }
+ }
+ else
+ {
+ if (TextFindIndex(filter, FILTER_FOLDER) >= 0)
+ {
+ strcpy(files->paths[files->count], path);
+ files->count++;
+ }
}
}
else
@@ -3402,7 +3417,22 @@ static void ScanDirectoryFilesRecursively(const char *basePath, FilePathList *fi
break;
}
}
- else ScanDirectoryFilesRecursively(path, files, filter);
+ else
+ {
+ if (filter != NULL && TextFindIndex(filter, FILTER_FOLDER) >= 0)
+ {
+ strcpy(files->paths[files->count], path);
+ files->count++;
+ }
+
+ if (files->count >= files->capacity)
+ {
+ TRACELOG(LOG_WARNING, "FILEIO: Maximum filepath scan capacity reached (%i files)", files->capacity);
+ break;
+ }
+
+ ScanDirectoryFilesRecursively(path, files, filter);
+ }
}
}