Introduction
Searching for files and directories is something we, as programmers, have to
do in many projects. I have always thought that there must be something someone
out there wrote to make my life easier in this regard. I have done a lot of
looking around but most of what I've found has had a dependency on a specific
IDE, like VS and MFC for example. So, I decided to write my own, make it IDE
independent and add some useful features. FindFile, is the result of my efforts.
Using the code
The code that allows searching consists of the files FindFile.h, FindFile.cpp,
wildcard.h, and wildcard.cpp. To use the code, you need to initialize a FindFileOptions_t structure
and pass it by reference to the constructor of FindFile. Here is
a snippet of the structure, listing options used by FindFile:
struct FindFileOptions_t
{
bool recursive; bool returnFolders;
bool *terminateValue;
string location;
string filter;
string excludeFile; string excludeDir; };
Some of these options require explaining. The returnFolders option
specifies whether FindFile should return both files and directories
in its return results. The terminateValue option is a pointer to
some integer in memory whose value will be read to determine whether the search
should be aborted. This is useful to have when incorporating this class in a
multi-threaded environment (as is most likely the case). If the value in the
integer pointed to by terminateValue is anything but 0 the search
will abort. If you do not want to use this feature, just set terminateValue
to NULL.
Here is an example of a program that uses FindFile:
FindFileOptions_t opts;
opts.excludeDir = "CSE*;*53*";
opts.excludeFile = "*.pdf;*.doc";
opts.filter = "*";
opts.location = "C:\\School";
opts.recursive = true;
opts.returnFolders = false;
opts.terminateValue = NULL;
FindFile find(opts);
find.search();
int nfiles = (int) find.filelist.size();
__int64 size = find.listsize;
for (int i = 0; i < (int) find.filelist.size(); i++)
{
string fullname = FindFile::combinePath(find.filelist[i].path,
find.filelist[i].fileinfo.cFileName);
printf("%s\n", fullname.c_str());
}
printf("Found: %d files (%ld bytes)", nfiles, size);
This example will recursively search for all files in directory "C:\School"
which do not have a PDF or DOC extension and will not look for files in subdirectories
that begin with "CSE" or contain "53".
History
- December 27, 2003
- Updated source code to reflect bug fix on searching of files in root drives.
- November 29, 2002
- All references to the GNU public license have been removed from the code. You
are free to use this code any way you see fit as long as the original copyright
statement remains in all versions you modify/redistribute.
- November 28, 2002
- This is the first version of the code but has been used in many projects of
mine for many years. If you find a bug, though, or feel some parts can be done
better, please let me know.