|
- /*
- ==============================================================================
-
- This file is part of the Water library.
- Copyright (c) 2016 ROLI Ltd.
- Copyright (C) 2017 Filipe Coelho <falktx@falktx.com>
-
- Permission is granted to use this software 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.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
- TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
- OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
- USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- OF THIS SOFTWARE.
-
- ==============================================================================
- */
-
- #include "DirectoryIterator.h"
- #include "../text/StringArray.h"
-
- namespace water {
-
- DirectoryIterator::DirectoryIterator (const File& directory, bool recursive,
- const String& pattern, const int type)
- : wildCards (parseWildcards (pattern)),
- fileFinder (directory, (recursive || wildCards.size() > 1) ? "*" : pattern),
- wildCard (pattern),
- path (File::addTrailingSeparator (directory.getFullPathName())),
- index (-1),
- totalNumFiles (-1),
- whatToLookFor (type),
- isRecursive (recursive),
- hasBeenAdvanced (false)
- {
- // you have to specify the type of files you're looking for!
- jassert ((type & (File::findFiles | File::findDirectories)) != 0);
- jassert (type > 0 && type <= 7);
- }
-
- DirectoryIterator::~DirectoryIterator()
- {
- }
-
- StringArray DirectoryIterator::parseWildcards (const String& pattern)
- {
- StringArray s;
- s.addTokens (pattern, ";,", "\"'");
- s.trim();
- s.removeEmptyStrings();
- return s;
- }
-
- bool DirectoryIterator::fileMatches (const StringArray& wildCards, const String& filename)
- {
- for (int i = 0; i < wildCards.size(); ++i)
- if (filename.matchesWildcard (wildCards[i], ! File::areFileNamesCaseSensitive()))
- return true;
-
- return false;
- }
-
- bool DirectoryIterator::next()
- {
- return next (nullptr, nullptr, nullptr, nullptr, nullptr);
- }
-
- bool DirectoryIterator::next (bool* const isDirResult, int64* const fileSize,
- Time* const modTime, Time* const creationTime, bool* const isReadOnly)
- {
- for (;;)
- {
- hasBeenAdvanced = true;
-
- if (subIterator != nullptr)
- {
- if (subIterator->next (isDirResult, fileSize, modTime, creationTime, isReadOnly))
- return true;
-
- subIterator = nullptr;
- }
-
- String filename;
- bool isDirectory, shouldContinue = false;
-
- while (fileFinder.next (filename, &isDirectory,
- fileSize, modTime, creationTime, isReadOnly))
- {
- ++index;
-
- if (! filename.containsOnly ("."))
- {
- bool matches = false;
-
- if (isDirectory)
- {
- if (isRecursive)
- subIterator = new DirectoryIterator (File::createFileWithoutCheckingPath (path + filename),
- true, wildCard, whatToLookFor);
-
- matches = (whatToLookFor & File::findDirectories) != 0;
- }
- else
- {
- matches = (whatToLookFor & File::findFiles) != 0;
- }
-
- // if we're not relying on the OS iterator to do the wildcard match, do it now..
- if (matches && (isRecursive || wildCards.size() > 1))
- matches = fileMatches (wildCards, filename);
-
- if (matches)
- {
- currentFile = File::createFileWithoutCheckingPath (path + filename);
- if (isDirResult != nullptr) *isDirResult = isDirectory;
-
- return true;
- }
-
- if (subIterator != nullptr)
- {
- shouldContinue = true;
- break;
- }
- }
- }
-
- if (! shouldContinue)
- return false;
- }
- }
-
- const File& DirectoryIterator::getFile() const
- {
- if (subIterator != nullptr && subIterator->hasBeenAdvanced)
- return subIterator->getFile();
-
- // You need to call DirectoryIterator::next() before asking it for the file that it found!
- jassert (hasBeenAdvanced);
-
- return currentFile;
- }
-
- float DirectoryIterator::getEstimatedProgress() const
- {
- if (totalNumFiles < 0)
- totalNumFiles = File (path).getNumberOfChildFiles (File::findFilesAndDirectories);
-
- if (totalNumFiles <= 0)
- return 0.0f;
-
- const float detailedIndex = (subIterator != nullptr) ? index + subIterator->getEstimatedProgress()
- : (float) index;
-
- return detailedIndex / totalNumFiles;
- }
-
- }
|