This is a simple example of how to use recursion to get a list of all the directories (folders) and file names within them. It also illustrates simple use if std::list, std::vector, std::string, std::cin and std::cout. It was compiled and tested with both VC++ 6.0 and Dev-C++ compilers on XP Pro.

// The next two lines are for VC++ 6.0 compiler.  You should 
// delete them if you compile it with a different compiler.
#include "stdafx.h"
#pragma warning(disable: 4786)
#include <io.h>
#include <string>
#include <vector>
#include <list>
#include <iostream>
using namespace std;

// structure to hold a directory and all its filenames.
	string path;
	vector<string> theList;

void TransverseDirectory(string path, list<FILELIST>& theList)
	struct _finddatai64_t data;
	// First create the filename that will be use to initialize the find.
	// "*.*" are wild card characters that tells the find function to return a 
	// list of all the files and directories.  You can limit this if you wish
	// to just file with specific extensions, for example "*.txt".  If you do that
	// then finder will not return any directory names.
	string fname = path + "\\*.*";
	// start the finder -- on error _findfirsti64() will return -1, otherwise if no
	// error it returns a handle greater than -1.
	long h = _findfirsti64(fname.c_str(),&data);
	if(h >= 0)
		FILELIST thisList;
		// add empty FILELIST structure to the linked list argument
		// get pointer to the FILELIST just added to the linked list above.
		list<FILELIST>::iterator it = theList.end();
		// set current path
		(*it).path = path;
		do {
			if( (data.attrib & _A_SUBDIR) )
				// make sure we skip "." and "..".  Have to use strcmp here because
				// some file names can start with a dot, so just testing for the 
				// first dot is not suffient.
				if( strcmp(data.name,".") != 0 &&strcmp(data.name,"..") != 0)
					// We found a sub-directory, so get the files in it too
					fname = path + "\\" + data.name;
					// recursion here!

				// this is just a normal filename.  So just add it to our vector

		}while( _findnexti64(h,&data) == 0);
		// close the find handle.  



int main(int argc, char* argv[])
	list<FILELIST> MyList;
	string path;
	cout << "Enter starting path ... ";
	list<FILELIST>::iterator it;
	// now just display all the files
	for(it = MyList.begin(); it != MyList.end(); it++)
		vector<string>::iterator its;
		for(its = (*it).theList.begin(); its != (*it).theList.end(); its++)
			cout << (*it).path + "\\" + (*its) << endl;

	return 0;
13 Years
Discussion Span
Last Post by Dani

Hmm ... I think something like this would be better suited to our Code Snippets section ... thanky very much for the contribution nonetheless!

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.