32 : directories (other.directories)
38 directories = other.directories;
48void FileSearchPath::init (
const String& path)
55 for (
auto& d : directories)
61 return directories.size();
71 return directories[index];
81 auto dirs = directories;
84 if (d.contains (separator))
87 return dirs.joinIntoString (separator);
97 for (
auto& d : directories)
107 directories.remove (index);
112 for (
int i = 0; i < other.getNumPaths(); ++i)
118 std::vector<String> reduced;
120 for (
const auto& directory : directories)
122 const auto checkedIsChildOf = [&] (
const auto& a,
const auto& b)
127 const auto fContainsDirectory = [&] (
const auto& f)
129 return f == directory || checkedIsChildOf (directory, f);
132 if (std::find_if (reduced.begin(), reduced.end(), fContainsDirectory) != reduced.end())
135 const auto directoryContainsF = [&] (
const auto& f) {
return checkedIsChildOf (f, directory); };
137 reduced.erase (std::remove_if (reduced.begin(), reduced.end(), directoryContainsF), reduced.end());
138 reduced.push_back (directory);
141 directories =
StringArray (reduced.data(), (
int) reduced.size());
146 for (
int i = directories.size(); --i >= 0;)
147 if (!
File (directories[i]).isDirectory())
148 directories.remove (i);
159 bool recurse,
const String& wildcard)
const
163 for (
auto& d : directories)
170 const bool checkRecursively)
const
172 for (
auto& d : directories)
174 if (checkRecursively)
193class FileSearchPathTests final :
public UnitTest
196 FileSearchPathTests() :
UnitTest (
"FileSearchPath", UnitTestCategories::files) {}
198 void runTest()
override
200 beginTest (
"removeRedundantPaths");
203 const String prefix =
"C:";
205 const String prefix =
"";
209 FileSearchPath fsp { prefix +
"/a/b/c/d;" + prefix +
"/a/b/c/e;" + prefix +
"/a/b/c" };
210 fsp.removeRedundantPaths();
211 expectEquals (fsp.toString(), prefix +
"/a/b/c");
215 FileSearchPath fsp { prefix +
"/a/b/c;" + prefix +
"/a/b/c/d;" + prefix +
"/a/b/c/e" };
216 fsp.removeRedundantPaths();
217 expectEquals (fsp.toString(), prefix +
"/a/b/c");
221 FileSearchPath fsp { prefix +
"/a/b/c/d;" + prefix +
"/a/b/c;" + prefix +
"/a/b/c/e" };
222 fsp.removeRedundantPaths();
223 expectEquals (fsp.toString(), prefix +
"/a/b/c");
227 FileSearchPath fsp {
"%FOO%;" + prefix +
"/a/b/c;%FOO%;" + prefix +
"/a/b/c/d" };
228 fsp.removeRedundantPaths();
229 expectEquals (fsp.toString(),
"%FOO%;" + prefix +
"/a/b/c");
235static FileSearchPathTests fileSearchPathTests;
bool isFileInPath(const File &fileToCheck, bool checkRecursively) const
void add(const File &directoryToAdd, int insertIndex=-1)
void remove(int indexToRemove)
void removeNonExistentPaths()
FileSearchPath & operator=(const FileSearchPath &)
void addPath(const FileSearchPath &)
File operator[](int index) const
void removeRedundantPaths()
bool addIfNotAlreadyThere(const File &directoryToAdd)
String toStringWithSeparator(StringRef separator) const
Array< File > findChildFiles(int whatToLookFor, bool searchRecursively, const String &wildCardPattern="*") const
String getRawString(int index) const
Array< File > findChildFiles(int whatToLookFor, bool searchRecursively, const String &wildCardPattern="*", FollowSymlinks followSymlinks=FollowSymlinks::yes) const
const String & getFullPathName() const noexcept
static bool isAbsolutePath(StringRef path)
File getParentDirectory() const
bool isAChildOf(const File &potentialParentDirectory) const
void removeEmptyStrings(bool removeWhitespaceStrings=true)
int addTokens(StringRef stringToTokenise, bool preserveQuotedStrings)
String quoted(juce_wchar quoteCharacter='"') const