/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-9 by Raw Material Software Ltd. ------------------------------------------------------------------------------ JUCE can be redistributed and/or modified under the terms of the GNU General Public License (Version 2), as published by the Free Software Foundation. A copy of the license is included in the JUCE distribution, or can be found online at www.gnu.org/licenses. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.rawmaterialsoftware.com/juce for more information. ============================================================================== */ #include "../../core/juce_StandardHeader.h" BEGIN_JUCE_NAMESPACE #include "juce_DirectoryIterator.h" void* juce_findFileStart (const String& directory, const String& wildCard, String& firstResultFile, bool* isDirectory, bool* isHidden, int64* fileSize, Time* modTime, Time* creationTime, bool* isReadOnly); bool juce_findFileNext (void* handle, String& resultFile, bool* isDirectory, bool* isHidden, int64* fileSize, Time* modTime, Time* creationTime, bool* isReadOnly); void juce_findFileClose (void* handle); //============================================================================== DirectoryIterator::DirectoryIterator (const File& directory, bool isRecursive, const String& wc, const int whatToLookFor_) : wildCard (wc), index (-1), whatToLookFor (whatToLookFor_) { // you have to specify the type of files you're looking for! jassert ((whatToLookFor_ & (File::findFiles | File::findDirectories)) != 0); jassert (whatToLookFor_ > 0 && whatToLookFor_ <= 7); String path (directory.getFullPathName()); if (! path.endsWithChar (File::separator)) path += File::separator; String filename; bool isDirectory, isHidden; void* const handle = juce_findFileStart (path, isRecursive ? "*" : wc, filename, &isDirectory, &isHidden, 0, 0, 0, 0); if (handle != 0) { do { if (! filename.containsOnly (".")) { bool addToList = false; if (isDirectory) { if (isRecursive && ((whatToLookFor_ & File::ignoreHiddenFiles) == 0 || ! isHidden)) { dirsFound.add (File (path + filename, 0)); } addToList = (whatToLookFor_ & File::findDirectories) != 0; } else { addToList = (whatToLookFor_ & File::findFiles) != 0; } // if it's recursive, we're not relying on the OS iterator // to do the wildcard match, so do it now.. if (isRecursive && addToList) addToList = filename.matchesWildcard (wc, true); if (addToList && (whatToLookFor_ & File::ignoreHiddenFiles) != 0) addToList = ! isHidden; if (addToList) filesFound.add (File (path + filename, 0)); } } while (juce_findFileNext (handle, filename, &isDirectory, &isHidden, 0, 0, 0, 0)); juce_findFileClose (handle); } } DirectoryIterator::~DirectoryIterator() { } bool DirectoryIterator::next() { if (subIterator != 0) { if (subIterator->next()) return true; subIterator = 0; } if (index >= filesFound.size() + dirsFound.size() - 1) return false; ++index; if (index >= filesFound.size()) { subIterator = new DirectoryIterator (dirsFound.getReference (index - filesFound.size()), true, wildCard, whatToLookFor); return next(); } return true; } const File DirectoryIterator::getFile() const { if (subIterator != 0) return subIterator->getFile(); return filesFound [index]; } float DirectoryIterator::getEstimatedProgress() const { if (filesFound.size() + dirsFound.size() == 0) { return 0.0f; } else { const float detailedIndex = (subIterator != 0) ? index + subIterator->getEstimatedProgress() : (float) index; return detailedIndex / (filesFound.size() + dirsFound.size()); } } END_JUCE_NAMESPACE