diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
index 2ca24b2b63..02f9c8fd60 100644
--- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
+++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
@@ -687,6 +687,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/files/juce_FileSearchPath.cpp"
"../../../../../modules/juce_core/files/juce_FileSearchPath.h"
"../../../../../modules/juce_core/files/juce_MemoryMappedFile.h"
+ "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp"
+ "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h"
"../../../../../modules/juce_core/files/juce_TemporaryFile.cpp"
"../../../../../modules/juce_core/files/juce_TemporaryFile.h"
"../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp"
@@ -2293,6 +2295,8 @@ set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOut
set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
diff --git a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj
index 2eb76a30a2..34933e60f0 100644
--- a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj
@@ -926,6 +926,9 @@
true
+
+ true
+
true
@@ -2615,6 +2618,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters
index 81006063ac..54f99e377e 100644
--- a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters
@@ -1357,6 +1357,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -3912,6 +3915,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
index 48e8291b26..9b921f557a 100644
--- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
@@ -926,6 +926,9 @@
true
+
+ true
+
true
@@ -2615,6 +2618,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
index f9b5f9cb8d..da89dbd840 100644
--- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
@@ -1357,6 +1357,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -3912,6 +3915,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
index b4873c703e..44e19ff233 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
@@ -926,6 +926,9 @@
true
+
+ true
+
true
@@ -2615,6 +2618,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
index 6ee06c3dea..b842c832b8 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
@@ -1357,6 +1357,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -3912,6 +3915,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
index 1d1ca5b84b..14a9a5420a 100644
--- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
@@ -526,6 +526,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/files/juce_FileSearchPath.cpp"
"../../../../../modules/juce_core/files/juce_FileSearchPath.h"
"../../../../../modules/juce_core/files/juce_MemoryMappedFile.h"
+ "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp"
+ "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h"
"../../../../../modules/juce_core/files/juce_TemporaryFile.cpp"
"../../../../../modules/juce_core/files/juce_TemporaryFile.h"
"../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp"
@@ -1816,6 +1818,8 @@ set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOut
set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj
index 7d70bf0e07..5f245bec0d 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj
@@ -712,6 +712,9 @@
true
+
+ true
+
true
@@ -2136,6 +2139,7 @@
+
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters
index e428d32762..b79dd06477 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters
@@ -994,6 +994,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -3087,6 +3090,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
index bcb48ae49c..5b2beba4bd 100644
--- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
@@ -543,6 +543,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/files/juce_FileSearchPath.cpp"
"../../../../../modules/juce_core/files/juce_FileSearchPath.h"
"../../../../../modules/juce_core/files/juce_MemoryMappedFile.h"
+ "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp"
+ "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h"
"../../../../../modules/juce_core/files/juce_TemporaryFile.cpp"
"../../../../../modules/juce_core/files/juce_TemporaryFile.h"
"../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp"
@@ -1906,6 +1908,8 @@ set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOut
set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj
index 1099144da1..f3db3c2e90 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj
@@ -719,6 +719,9 @@
true
+
+ true
+
true
@@ -2212,6 +2215,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters
index 1e4b8752e0..faec4a60ff 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters
@@ -1051,6 +1051,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -3240,6 +3243,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
index db90221a5e..35870f9878 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
@@ -719,6 +719,9 @@
true
+
+ true
+
true
@@ -2212,6 +2215,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
index c787b9c371..d84b6ad583 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
@@ -1051,6 +1051,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -3240,6 +3243,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
index b9f3008a2a..1b7a41738f 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
@@ -719,6 +719,9 @@
true
+
+ true
+
true
@@ -2212,6 +2215,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
index a9b9cd5ba0..ee229dd626 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
@@ -1051,6 +1051,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -3240,6 +3243,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj b/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj
index 6369613695..71bf2fc42f 100644
--- a/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj
+++ b/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj
@@ -187,6 +187,9 @@
true
+
+ true
+
true
@@ -469,6 +472,7 @@
+
diff --git a/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj.filters b/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj.filters
index 1cb4265e19..9750fee0f0 100644
--- a/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj.filters
+++ b/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj.filters
@@ -127,6 +127,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -477,6 +480,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
index d6ee01eae3..b42e6bfd63 100644
--- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
+++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
@@ -530,6 +530,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/files/juce_FileSearchPath.cpp"
"../../../../../modules/juce_core/files/juce_FileSearchPath.h"
"../../../../../modules/juce_core/files/juce_MemoryMappedFile.h"
+ "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp"
+ "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h"
"../../../../../modules/juce_core/files/juce_TemporaryFile.cpp"
"../../../../../modules/juce_core/files/juce_TemporaryFile.h"
"../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp"
@@ -1895,6 +1897,8 @@ set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOut
set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj
index 082592e57b..60d80f49ff 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj
@@ -712,6 +712,9 @@
true
+
+ true
+
true
@@ -2221,6 +2224,7 @@
+
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters
index c1edaf5f75..118807326e 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters
@@ -1024,6 +1024,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -3222,6 +3225,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj
index 25f923517a..623084444b 100644
--- a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj
@@ -328,6 +328,9 @@
true
+
+ true
+
true
@@ -1716,6 +1719,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters
index ad63e271d1..7dd92a6dd0 100644
--- a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters
@@ -613,6 +613,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -2559,6 +2562,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
index 4adbfe2f3a..80abca404c 100644
--- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
@@ -328,6 +328,9 @@
true
+
+ true
+
true
@@ -1716,6 +1719,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
index e8840a14e9..fde62326ba 100644
--- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
@@ -613,6 +613,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -2559,6 +2562,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
index fb1fe9dcd6..e873a766b8 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
@@ -328,6 +328,9 @@
true
+
+ true
+
true
@@ -1716,6 +1719,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
index bea1bfdaff..ec4b8478e3 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
@@ -613,6 +613,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -2559,6 +2562,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/Projucer/Source/Application/jucer_Application.cpp b/extras/Projucer/Source/Application/jucer_Application.cpp
index 3e09a9ec4c..a0624e8492 100644
--- a/extras/Projucer/Source/Application/jucer_Application.cpp
+++ b/extras/Projucer/Source/Application/jucer_Application.cpp
@@ -638,8 +638,7 @@ Array ProjucerApplication::getSortedExampleDirectories() noexcept
if (! isValidJUCEExamplesDirectory (examplesPath))
return {};
- DirectoryIterator iter (examplesPath, false, "*", File::findDirectories);
- while (iter.next())
+ for (const auto& iter : RangedDirectoryIterator (examplesPath, false, "*", File::findDirectories))
{
auto exampleDirectory = iter.getFile();
@@ -657,8 +656,7 @@ Array ProjucerApplication::getSortedExampleFilesInDirectory (const File& d
{
Array exampleFiles;
- DirectoryIterator iter (directory, false, "*.h", File::findFiles);
- while (iter.next())
+ for (const auto& iter : RangedDirectoryIterator (directory, false, "*.h", File::findFiles))
exampleFiles.add (iter.getFile());
exampleFiles.sort();
diff --git a/extras/Projucer/Source/Application/jucer_CommandLine.cpp b/extras/Projucer/Source/Application/jucer_CommandLine.cpp
index 69a56096af..7fa08b9483 100644
--- a/extras/Projucer/Source/Application/jucer_CommandLine.cpp
+++ b/extras/Projucer/Source/Application/jucer_CommandLine.cpp
@@ -40,7 +40,7 @@ namespace
{
Array files;
- for (DirectoryIterator di (folder, true, "*.cpp;*.cxx;*.cc;*.c;*.h;*.hpp;*.hxx;*.hpp;*.mm;*.m;*.java;*.dox;*.soul;*.js", File::findFiles); di.next();)
+ for (const auto& di : RangedDirectoryIterator (folder, true, "*.cpp;*.cxx;*.cc;*.c;*.h;*.hpp;*.hxx;*.hpp;*.mm;*.m;*.java;*.dox;*.soul;*.js", File::findFiles))
if (! di.getFile().isSymbolicLink())
files.add (di.getFile());
@@ -263,9 +263,7 @@ namespace
ZipFile::Builder zip;
{
- DirectoryIterator i (moduleFolder, true, "*", File::findFiles);
-
- while (i.next())
+ for (const auto& i : RangedDirectoryIterator (moduleFolder, true, "*", File::findFiles))
if (! i.getFile().isHidden())
zip.addFile (i.getFile(), 9, i.getFile().getRelativePathFrom (moduleFolderParent));
}
@@ -298,10 +296,9 @@ namespace
if (buildAllWithIndex)
{
auto folderToSearch = args[2].resolveAsFile();
- DirectoryIterator i (folderToSearch, false, "*", File::findDirectories);
var infoList;
- while (i.next())
+ for (const auto& i : RangedDirectoryIterator (folderToSearch, false, "*", File::findDirectories))
{
LibraryModule module (i.getFile());
diff --git a/extras/Projucer/Source/Project/jucer_Module.cpp b/extras/Projucer/Source/Project/jucer_Module.cpp
index 116926944f..d9d398d1bb 100644
--- a/extras/Projucer/Source/Project/jucer_Module.cpp
+++ b/extras/Projucer/Source/Project/jucer_Module.cpp
@@ -73,7 +73,7 @@ static void addAllModulesInSubfoldersRecursively (const File& path, int depth, A
{
if (depth > 0)
{
- for (DirectoryIterator iter (path, false, "*", File::findDirectories); iter.next();)
+ for (const auto& iter : RangedDirectoryIterator (path, false, "*", File::findDirectories))
{
if (auto* job = ThreadPoolJob::getCurrentThreadPoolJob())
if (job->shouldExit())
@@ -415,11 +415,8 @@ void LibraryModule::findBrowseableFiles (const File& folder, Array& filesF
Array tempList;
FileSorter sorter;
- DirectoryIterator iter (folder, true, "*", File::findFiles);
- bool isHiddenFile;
-
- while (iter.next (nullptr, &isHiddenFile, nullptr, nullptr, nullptr, nullptr))
- if (! isHiddenFile && iter.getFile().hasFileExtension (browseableFileExtensions))
+ for (const auto& iter : RangedDirectoryIterator (folder, true, "*", File::findFiles))
+ if (! iter.isHidden() && iter.getFile().hasFileExtension (browseableFileExtensions))
tempList.addSorted (sorter, iter.getFile());
filesFound.addArray (tempList);
diff --git a/extras/Projucer/Source/Project/jucer_Project.cpp b/extras/Projucer/Source/Project/jucer_Project.cpp
index 337c72bb12..e676ace124 100644
--- a/extras/Projucer/Source/Project/jucer_Project.cpp
+++ b/extras/Projucer/Source/Project/jucer_Project.cpp
@@ -1502,7 +1502,7 @@ bool Project::Item::addFileAtIndex (const File& file, int insertIndex, const boo
{
auto group = addNewSubGroup (file.getFileName(), insertIndex);
- for (DirectoryIterator iter (file, false, "*", File::findFilesAndDirectories); iter.next();)
+ for (const auto& iter : RangedDirectoryIterator (file, false, "*", File::findFilesAndDirectories))
if (! project.getMainGroup().findItemForFile (iter.getFile()).isValid())
group.addFileRetainingSortOrder (iter.getFile(), shouldCompile);
}
diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h
index ad4a95eb81..d474bee71a 100644
--- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h
+++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h
@@ -2221,9 +2221,9 @@ private:
// Delete .rsrc files in folder but don't follow sym-links
void deleteRsrcFiles (const File& folder) const
{
- for (DirectoryIterator di (folder, false, "*", File::findFilesAndDirectories); di.next();)
+ for (const auto& di : RangedDirectoryIterator (folder, false, "*", File::findFilesAndDirectories))
{
- auto& entry = di.getFile();
+ const auto& entry = di.getFile();
if (! entry.isSymbolicLink())
{
diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h
index a642445bd8..56f1edaad4 100644
--- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h
+++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h
@@ -262,11 +262,9 @@ private:
bool deleteUnwantedFilesIn (const File& parent)
{
bool folderIsNowEmpty = true;
- DirectoryIterator i (parent, false, "*", File::findFilesAndDirectories);
Array filesToDelete;
- bool isFolder;
- while (i.next (&isFolder, nullptr, nullptr, nullptr, nullptr, nullptr))
+ for (const auto& i : RangedDirectoryIterator (parent, false, "*", File::findFilesAndDirectories))
{
auto f = i.getFile();
@@ -274,7 +272,7 @@ private:
{
folderIsNowEmpty = false;
}
- else if (isFolder)
+ else if (i.isDirectory())
{
if (deleteUnwantedFilesIn (f))
filesToDelete.add (f);
diff --git a/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp b/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp
index 1c1b944a82..951033855c 100644
--- a/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp
+++ b/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp
@@ -173,8 +173,7 @@ void StoredSettings::updateOldProjectSettingsFiles()
auto newProjectSettingsDir = projucerSettingsDirectory.getChildFile ("ProjectSettings");
newProjectSettingsDir.createDirectory();
- DirectoryIterator iter (projucerSettingsDirectory, false, "*.settings");
- while (iter.next())
+ for (const auto& iter : RangedDirectoryIterator (projucerSettingsDirectory, false, "*.settings"))
{
auto f = iter.getFile();
auto oldFileName = f.getFileName();
diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp b/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp
index b9375b5924..c91f90abd1 100644
--- a/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp
+++ b/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp
@@ -24,9 +24,7 @@ namespace FileHelpers
{
bool containsAnyNonHiddenFiles (const File& folder)
{
- DirectoryIterator di (folder, false);
-
- while (di.next())
+ for (const auto& di : RangedDirectoryIterator (folder, false))
if (! di.getFile().isHidden())
return true;
diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h b/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h
index c21c174124..b7896404dc 100644
--- a/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h
+++ b/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h
@@ -161,9 +161,9 @@ struct TranslationHelpers
static void scanFolderForTranslations (StringArray& strings, const File& root)
{
- for (DirectoryIterator i (root, true); i.next();)
+ for (const auto& i : RangedDirectoryIterator (root, true))
{
- const auto file (i.getFile());
+ const auto file = i.getFile();
if (file.hasFileExtension (sourceOrHeaderFileExtensions))
scanFileForTranslations(strings, file);
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
index f2a742b398..c8d44414ca 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
@@ -782,6 +782,9 @@
true
+
+ true
+
true
@@ -2417,6 +2420,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
index 8aefc52534..5220044812 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -1165,6 +1165,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -3558,6 +3561,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
index 2fb33d8c53..7c39f54375 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
@@ -782,6 +782,9 @@
true
+
+ true
+
true
@@ -2417,6 +2420,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
index 419f6719fb..851af349ea 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -1165,6 +1165,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -3558,6 +3561,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj
index e8e27a98da..cb5ff33ac9 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj
+++ b/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj
@@ -711,6 +711,9 @@
true
+
+ true
+
true
@@ -2197,6 +2200,7 @@
+
diff --git a/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters
index de1ce40c47..ab6aa28619 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters
@@ -1021,6 +1021,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
@@ -3189,6 +3192,9 @@
JUCE Modules\juce_core\files
+
+ JUCE Modules\juce_core\files
+
JUCE Modules\juce_core\files
diff --git a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp
index ec937bfc0f..d65642de67 100644
--- a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp
+++ b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp
@@ -683,9 +683,8 @@ StringArray LADSPAPluginFormat::searchPathsForPlugins (const FileSearchPath& dir
void LADSPAPluginFormat::recursiveFileSearch (StringArray& results, const File& dir, const bool recursive)
{
- DirectoryIterator iter (dir, false, "*", File::findFilesAndDirectories);
- while (iter.next())
+ for (const auto& iter : RangedDirectoryIterator (dir, false, "*", File::findFilesAndDirectories))
{
auto f = iter.getFile();
bool isPlugin = false;
diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp
index 39fe46519c..5040407dc8 100644
--- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp
+++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp
@@ -3175,9 +3175,7 @@ StringArray VST3PluginFormat::searchPathsForPlugins (const FileSearchPath& direc
void VST3PluginFormat::recursiveFileSearch (StringArray& results, const File& directory, const bool recursive)
{
- DirectoryIterator iter (directory, false, "*", File::findFilesAndDirectories);
-
- while (iter.next())
+ for (const auto& iter : RangedDirectoryIterator (directory, false, "*", File::findFilesAndDirectories))
{
auto f = iter.getFile();
bool isPlugin = false;
diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
index d268aeb049..a566774517 100644
--- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
+++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
@@ -3605,9 +3605,7 @@ void VSTPluginFormat::recursiveFileSearch (StringArray& results, const File& dir
{
// avoid allowing the dir iterator to be recursive, because we want to avoid letting it delve inside
// .component or .vst directories.
- DirectoryIterator iter (dir, false, "*", File::findFilesAndDirectories);
-
- while (iter.next())
+ for (const auto& iter : RangedDirectoryIterator (dir, false, "*", File::findFilesAndDirectories))
{
auto f = iter.getFile();
bool isPlugin = false;
diff --git a/modules/juce_core/files/juce_DirectoryIterator.cpp b/modules/juce_core/files/juce_DirectoryIterator.cpp
index 487301b767..bd393a4f4e 100644
--- a/modules/juce_core/files/juce_DirectoryIterator.cpp
+++ b/modules/juce_core/files/juce_DirectoryIterator.cpp
@@ -64,6 +64,9 @@ bool DirectoryIterator::next()
return next (nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
}
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")
+JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996)
+
bool DirectoryIterator::next (bool* isDirResult, bool* isHiddenResult, int64* fileSize,
Time* modTime, Time* creationTime, bool* isReadOnly)
{
@@ -134,6 +137,9 @@ bool DirectoryIterator::next (bool* isDirResult, bool* isHiddenResult, int64* fi
}
}
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE
+JUCE_END_IGNORE_WARNINGS_MSVC
+
const File& DirectoryIterator::getFile() const
{
if (subIterator != nullptr && subIterator->hasBeenAdvanced)
diff --git a/modules/juce_core/files/juce_DirectoryIterator.h b/modules/juce_core/files/juce_DirectoryIterator.h
index 2ad9d3264a..59b9d604f1 100644
--- a/modules/juce_core/files/juce_DirectoryIterator.h
+++ b/modules/juce_core/files/juce_DirectoryIterator.h
@@ -25,6 +25,8 @@ namespace juce
//==============================================================================
/**
+ This class is now deprecated in favour of RangedDirectoryIterator.
+
Searches through the files in a directory, returning each file that is found.
A DirectoryIterator will search through a directory and its subdirectories using
@@ -42,12 +44,15 @@ namespace juce
It also provides an estimate of its progress, using a (highly inaccurate!) algorithm.
@tags{Core}
+ @see RangedDirectoryIterator
*/
class JUCE_API DirectoryIterator final
{
public:
//==============================================================================
- /** Creates a DirectoryIterator for a given directory.
+ /** This class is now deprecated in favour of RangedDirectoryIterator.
+
+ Creates a DirectoryIterator for a given directory.
After creating one of these, call its next() method to get the
first file - e.g. @code
@@ -68,11 +73,12 @@ public:
separated by a semi-colon or comma, e.g. "*.jpg;*.png"
@param whatToLookFor a value from the File::TypesOfFileToFind enum, specifying
whether to look for files, directories, or both.
+ @see RangedDirectoryIterator
*/
- DirectoryIterator (const File& directory,
- bool isRecursive,
- const String& wildCard = "*",
- int whatToLookFor = File::findFiles);
+ JUCE_DEPRECATED (DirectoryIterator (const File& directory,
+ bool isRecursive,
+ const String& wildCard = "*",
+ int whatToLookFor = File::findFiles));
/** Destructor. */
~DirectoryIterator();
diff --git a/modules/juce_core/files/juce_File.cpp b/modules/juce_core/files/juce_File.cpp
index a7eab140fc..8f45f8d73a 100644
--- a/modules/juce_core/files/juce_File.cpp
+++ b/modules/juce_core/files/juce_File.cpp
@@ -574,7 +574,7 @@ int File::findChildFiles (Array& results, int whatToLookFor, bool searchRe
{
int total = 0;
- for (DirectoryIterator di (*this, searchRecursively, wildcard, whatToLookFor); di.next();)
+ for (const auto& di : RangedDirectoryIterator (*this, searchRecursively, wildcard, whatToLookFor))
{
results.add (di.getFile());
++total;
@@ -585,12 +585,10 @@ int File::findChildFiles (Array& results, int whatToLookFor, bool searchRe
int File::getNumberOfChildFiles (const int whatToLookFor, const String& wildCardPattern) const
{
- int total = 0;
-
- for (DirectoryIterator di (*this, false, wildCardPattern, whatToLookFor); di.next();)
- ++total;
-
- return total;
+ return std::accumulate (RangedDirectoryIterator (*this, false, wildCardPattern, whatToLookFor),
+ RangedDirectoryIterator(),
+ 0,
+ [] (int acc, const DirectoryEntry&) { return acc + 1; });
}
bool File::containsSubDirectories() const
@@ -598,8 +596,7 @@ bool File::containsSubDirectories() const
if (! isDirectory())
return false;
- DirectoryIterator di (*this, false, "*", findDirectories);
- return di.next();
+ return RangedDirectoryIterator (*this, false, "*", findDirectories) != RangedDirectoryIterator();
}
//==============================================================================
diff --git a/modules/juce_core/files/juce_File.h b/modules/juce_core/files/juce_File.h
index de2e7fdaae..9470a36a5c 100644
--- a/modules/juce_core/files/juce_File.h
+++ b/modules/juce_core/files/juce_File.h
@@ -574,7 +574,7 @@ public:
@param wildCardPattern the filename pattern to search for, e.g. "*.txt"
@returns the set of files that were found
- @see getNumberOfChildFiles, DirectoryIterator
+ @see getNumberOfChildFiles, RangedDirectoryIterator
*/
Array findChildFiles (int whatToLookFor,
bool searchRecursively,
@@ -602,7 +602,8 @@ public:
is also added to this value, hidden files won't be counted
@param wildCardPattern the filename pattern to search for, e.g. "*.txt"
@returns the number of matches found
- @see findChildFiles, DirectoryIterator
+
+ @see findChildFiles, RangedDirectoryIterator
*/
int getNumberOfChildFiles (int whatToLookFor,
const String& wildCardPattern = "*") const;
diff --git a/modules/juce_core/files/juce_RangedDirectoryIterator.cpp b/modules/juce_core/files/juce_RangedDirectoryIterator.cpp
new file mode 100644
index 0000000000..170610c6df
--- /dev/null
+++ b/modules/juce_core/files/juce_RangedDirectoryIterator.cpp
@@ -0,0 +1,68 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce
+{
+
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")
+JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996)
+
+// We implement this in terms of the deprecated DirectoryIterator,
+// but the old DirectoryIterator might go away in the future!
+RangedDirectoryIterator::RangedDirectoryIterator (const File& directory,
+ bool isRecursive,
+ const String& wildCard,
+ int whatToLookFor)
+ : iterator (new DirectoryIterator (directory,
+ isRecursive,
+ wildCard,
+ whatToLookFor))
+{
+ increment();
+}
+
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE
+JUCE_END_IGNORE_WARNINGS_MSVC
+
+bool RangedDirectoryIterator::next()
+{
+ const auto result = iterator->next (&entry.directory,
+ &entry.hidden,
+ &entry.fileSize,
+ &entry.modTime,
+ &entry.creationTime,
+ &entry.readOnly);
+ if (result)
+ entry.file = iterator->getFile();
+ else
+ entry = {};
+
+ return result;
+}
+
+void RangedDirectoryIterator::increment()
+{
+ if (iterator != nullptr && ! next())
+ iterator = nullptr;
+}
+
+} // namespace juce
diff --git a/modules/juce_core/files/juce_RangedDirectoryIterator.h b/modules/juce_core/files/juce_RangedDirectoryIterator.h
new file mode 100644
index 0000000000..21c78771dd
--- /dev/null
+++ b/modules/juce_core/files/juce_RangedDirectoryIterator.h
@@ -0,0 +1,169 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce
+{
+
+//==============================================================================
+/** Describes the attributes of a file or folder. */
+class DirectoryEntry final
+{
+public:
+ /** The path to a file or folder. */
+ File getFile() const { return file; }
+
+ /** The time at which the item was last modified. */
+ Time getModificationTime() const { return modTime; }
+
+ /** The time at which the item was created. */
+ Time getCreationTime() const { return creationTime; }
+
+ /** The size of the item. */
+ int64 getFileSize() const { return fileSize; }
+
+ /** True if the item is a directory, false otherwise. */
+ bool isDirectory() const { return directory; }
+
+ /** True if the item is hidden, false otherwise. */
+ bool isHidden() const { return hidden; }
+
+ /** True if the item is read-only, false otherwise. */
+ bool isReadOnly() const { return readOnly; }
+
+private:
+ File file;
+ Time modTime;
+ Time creationTime;
+ int64 fileSize = 0;
+ bool directory = false;
+ bool hidden = false;
+ bool readOnly = false;
+
+ friend class RangedDirectoryIterator;
+};
+
+/** A convenience operator so that the expression `*it++` works correctly when
+ `it` is an instance of RangedDirectoryIterator.
+*/
+inline const DirectoryEntry& operator* (const DirectoryEntry& e) noexcept { return e; }
+
+//==============================================================================
+/**
+ Allows iterating over files and folders using C++11 range-for syntax.
+
+ In the following example, we recursively find all hidden files in a
+ specific directory.
+
+ @code
+ std::vector hiddenFiles;
+
+ for (DirectoryEntry entry : RangedDirectoryIterator (File ("/path/to/folder"), isRecursive))
+ if (entry.isHidden())
+ hiddenFiles.push_back (entry.getFile());
+ @endcode
+*/
+class RangedDirectoryIterator final
+{
+public:
+ using difference_type = std::ptrdiff_t;
+ using value_type = DirectoryEntry;
+ using reference = DirectoryEntry;
+ using pointer = void;
+ using iterator_category = std::input_iterator_tag;
+
+ /** The default-constructed iterator acts as the 'end' sentinel. */
+ RangedDirectoryIterator() = default;
+
+ /** Creates a RangedDirectoryIterator for a given directory.
+
+ The resulting iterator can be used directly in a 'range-for' expression.
+
+ @param directory the directory to search in
+ @param isRecursive whether all the subdirectories should also be searched
+ @param wildCard the file pattern to match. This may contain multiple patterns
+ separated by a semi-colon or comma, e.g. "*.jpg;*.png"
+ @param whatToLookFor a value from the File::TypesOfFileToFind enum, specifying
+ whether to look for files, directories, or both.
+ */
+ RangedDirectoryIterator (const File& directory,
+ bool isRecursive,
+ const String& wildCard = "*",
+ int whatToLookFor = File::findFiles);
+
+ /** Returns true if both iterators are in their end/sentinel state,
+ otherwise returns false.
+ */
+ bool operator== (const RangedDirectoryIterator& other) const noexcept
+ {
+ return iterator == nullptr && other.iterator == nullptr;
+ }
+
+ /** Returns the inverse of operator== */
+ bool operator!= (const RangedDirectoryIterator& other) const noexcept
+ {
+ return ! operator== (other);
+ }
+
+ /** Return an object containing metadata about the file or folder to
+ which the iterator is currently pointing.
+ */
+ const DirectoryEntry& operator* () const noexcept { return entry; }
+ const DirectoryEntry* operator->() const noexcept { return &entry; }
+
+ /** Moves the iterator along to the next file. */
+ RangedDirectoryIterator& operator++()
+ {
+ increment();
+ return *this;
+ }
+
+ /** Moves the iterator along to the next file.
+
+ @returns an object containing metadata about the file or folder to
+ to which the iterator was previously pointing.
+ */
+ DirectoryEntry operator++ (int)
+ {
+ auto result = *(*this);
+ ++(*this);
+ return result;
+ }
+
+private:
+ bool next();
+ void increment();
+
+ std::shared_ptr iterator;
+ DirectoryEntry entry;
+};
+
+/** Returns the iterator that was passed in.
+ Provided for range-for compatibility.
+*/
+inline RangedDirectoryIterator begin (const RangedDirectoryIterator& it) { return it; }
+
+/** Returns a default-constructed sentinel value.
+ Provided for range-for compatibility.
+*/
+inline RangedDirectoryIterator end (const RangedDirectoryIterator&) { return {}; }
+
+} // namespace juce
diff --git a/modules/juce_core/juce_core.cpp b/modules/juce_core/juce_core.cpp
index 2799122708..0aedbba2a7 100644
--- a/modules/juce_core/juce_core.cpp
+++ b/modules/juce_core/juce_core.cpp
@@ -124,6 +124,7 @@
#include "containers/juce_ReferenceCountedArray.cpp"
#include "containers/juce_SparseSet.cpp"
#include "files/juce_DirectoryIterator.cpp"
+#include "files/juce_RangedDirectoryIterator.cpp"
#include "files/juce_File.cpp"
#include "files/juce_FileInputStream.cpp"
#include "files/juce_FileOutputStream.cpp"
diff --git a/modules/juce_core/juce_core.h b/modules/juce_core/juce_core.h
index 8108f1b28a..a1c54d7d2c 100644
--- a/modules/juce_core/juce_core.h
+++ b/modules/juce_core/juce_core.h
@@ -283,6 +283,7 @@ JUCE_END_IGNORE_WARNINGS_MSVC
#include "streams/juce_InputSource.h"
#include "files/juce_File.h"
#include "files/juce_DirectoryIterator.h"
+#include "files/juce_RangedDirectoryIterator.h"
#include "files/juce_FileInputStream.h"
#include "files/juce_FileOutputStream.h"
#include "files/juce_FileSearchPath.h"
diff --git a/modules/juce_core/native/juce_android_Files.cpp b/modules/juce_core/native/juce_android_Files.cpp
index 4163c59a55..9fedfc2688 100644
--- a/modules/juce_core/native/juce_android_Files.cpp
+++ b/modules/juce_core/native/juce_android_Files.cpp
@@ -319,9 +319,8 @@ private:
return {};
auto rootFsDevice = info.st_dev;
- DirectoryIterator iter (mountFolder, false, "*", File::findDirectories);
- while (iter.next())
+ for (const auto& iter : RangedDirectoryIterator (mountFolder, false, "*", File::findDirectories))
{
auto candidate = iter.getFile();
diff --git a/modules/juce_core/system/juce_StandardHeader.h b/modules/juce_core/system/juce_StandardHeader.h
index 89938d9347..08016a4e07 100644
--- a/modules/juce_core/system/juce_StandardHeader.h
+++ b/modules/juce_core/system/juce_StandardHeader.h
@@ -43,22 +43,24 @@
//==============================================================================
-#include
-#include
-#include
-#include
-#include
#include
-#include
#include
-#include
-#include
-#include