1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-28 02:30:05 +00:00
JUCE/src/io/files/juce_DirectoryIterator.cpp

160 lines
5.2 KiB
C++

/*
==============================================================================
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 ? T("*") : wc,
filename, &isDirectory, &isHidden, 0, 0, 0, 0);
if (handle != 0)
{
do
{
if (! filename.containsOnly (T(".")))
{
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