How can I get the list of files in a directory using C or C++?

C++CFileDirectory

C++ Problem Overview


How can I determine the list of files in a directory from inside my C or C++ code?

I'm not allowed to execute the ls command and parse the results from within my program.

C++ Solutions


Solution 1 - C++

UPDATE 2017:

In C++17 there is now an official way to list files of your file system: std::filesystem. There is an excellent answer from Shreevardhan below with this source code: > #include > #include > #include > namespace fs = std::filesystem; >
> int main() > { > std::string path = "/path/to/directory"; > for (const auto & entry : fs::directory_iterator(path)) > std::cout << entry.path() << std::endl; > }

Old Answer:

In small and simple tasks I do not use boost, I use dirent.h. It is available as a standard header in UNIX, and also available for Windows via a compatibility layer created by Toni Ronkko.

DIR *dir;
struct dirent *ent;
if ((dir = opendir ("c:\\src\\")) != NULL) {
  /* print all the files and directories within directory */
  while ((ent = readdir (dir)) != NULL) {
    printf ("%s\n", ent->d_name);
  }
  closedir (dir);
} else {
  /* could not open directory */
  perror ("");
  return EXIT_FAILURE;
}

It is just a small header file and does most of the simple stuff you need without using a big template-based approach like boost (no offence, I like boost!).

Solution 2 - C++

C++17 now has a std::filesystem::directory_iterator, which can be used as

#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
 
int main() {
    std::string path = "/path/to/directory";
    for (const auto & entry : fs::directory_iterator(path))
        std::cout << entry.path() << std::endl;
}

Also, std::filesystem::recursive_directory_iterator can iterate the subdirectories as well.

Solution 3 - C++

Unfortunately the C++ standard does not define a standard way of working with files and folders in this way.

Since there is no cross platform way, the best cross platform way is to use a library such as the boost filesystem module.

Cross platform boost method:

> The following function, given a directory path and a file name, recursively searches the directory and its sub-directories for the file name, returning a bool, and if successful, the path to the file that was found. > > bool find_file(const path & dir_path, // in this directory, > const std::string & file_name, // search for this name, > path & path_found) // placing path here if found > { > if (!exists(dir_path)) > return false; >
> directory_iterator end_itr; // default construction yields past-the-end >
> for (directory_iterator itr(dir_path); itr != end_itr; ++itr) > { > if (is_directory(itr->status())) > { > if (find_file(itr->path(), file_name, path_found)) > return true; > } > else if (itr->leaf() == file_name) // see below > { > path_found = itr->path(); > return true; > } > } > return false; > }

Source from the boost page mentioned above.

For Unix/Linux based systems:

You can use opendir / readdir / closedir.

> Sample code which searches a directory for entry ``name'' is: > > len = strlen(name); > dirp = opendir("."); > while ((dp = readdir(dirp)) != NULL) > if (dp->d_namlen == len && !strcmp(dp->d_name, name)) { > (void)closedir(dirp); > return FOUND; > } > (void)closedir(dirp); > return NOT_FOUND;

Source code from the above man pages.

For a windows based systems:

You can use the Win32 API FindFirstFile / FindNextFile / FindClose functions.

> The following C++ example shows you a minimal use of FindFirstFile. > > #include > #include > #include >
> void _tmain(int argc, TCHAR *argv[]) > { > WIN32_FIND_DATA FindFileData; > HANDLE hFind; >
> if( argc != 2 ) > { > _tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]); > return; > } >
> _tprintf (TEXT("Target file is %s\n"), argv1); > hFind = FindFirstFile(argv1, &FindFileData); > if (hFind == INVALID_HANDLE_VALUE) > { > printf ("FindFirstFile failed (%d)\n", GetLastError()); > return; > } > else > { > _tprintf (TEXT("The first file found is %s\n"), > FindFileData.cFileName); > FindClose(hFind); > } > }

Source code from the above msdn pages.

Solution 4 - C++

One function is enough, you don't need to use any 3rd-party library (for Windows).

#include <Windows.h>

vector<string> get_all_files_names_within_folder(string folder)
{
	vector<string> names;
	string search_path = folder + "/*.*";
	WIN32_FIND_DATA fd; 
	HANDLE hFind = ::FindFirstFile(search_path.c_str(), &fd); 
	if(hFind != INVALID_HANDLE_VALUE) { 
		do { 
			// read all (real) files in current folder
			// , delete '!' read other 2 default folder . and ..
			if(! (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) {
				names.push_back(fd.cFileName);
			}
		}while(::FindNextFile(hFind, &fd)); 
		::FindClose(hFind); 
	} 
	return names;
}

PS: as mentioned by @Sebastian, you could change *.* to *.ext in order to get only the EXT-files (i.e. of a specific type) in that directory.

Solution 5 - C++

For a C only solution, please check this out. It only requires an extra header:

https://github.com/cxong/tinydir

tinydir_dir dir;
tinydir_open(&dir, "/path/to/dir");

while (dir.has_next)
{
	tinydir_file file;
	tinydir_readfile(&dir, &file);

	printf("%s", file.name);
	if (file.is_dir)
	{
		printf("/");
	}
	printf("\n");

	tinydir_next(&dir);
}

tinydir_close(&dir);

Some advantages over other options:

  • It's portable - wraps POSIX dirent and Windows FindFirstFile
  • It uses readdir_r where available, which means it's (usually) threadsafe
  • Supports Windows UTF-16 via the same UNICODE macros
  • It is C90 so even very ancient compilers can use it

Solution 6 - C++

I recommend using glob with this reusable wrapper. It generates a vector<string> corresponding to file paths that fit the glob pattern:

#include <glob.h>
#include <vector>
using std::vector;

vector<string> globVector(const string& pattern){
	glob_t glob_result;
	glob(pattern.c_str(),GLOB_TILDE,NULL,&glob_result);
	vector<string> files;
	for(unsigned int i=0;i<glob_result.gl_pathc;++i){
		files.push_back(string(glob_result.gl_pathv[i]));
	}
	globfree(&glob_result);
	return files;
}

Which can then be called with a normal system wildcard pattern such as:

vector<string> files = globVector("./*");

Solution 7 - C++

I think, below snippet can be used to list all the files.

#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>

int main(int argc, char** argv) { 
    list_dir("myFolderName");
    return EXIT_SUCCESS;
}  

static void list_dir(const char *path) {
    struct dirent *entry;
    DIR *dir = opendir(path);
    if (dir == NULL) {
        return;
    }

    while ((entry = readdir(dir)) != NULL) {
        printf("%s\n",entry->d_name);
    }

    closedir(dir);
}

This is the structure used (present in dirent.h):

struct dirent {
    ino_t d_ino; /* inode number */
    off_t d_off; /* offset to the next dirent */
    unsigned short d_reclen; /* length of this record */
    unsigned char d_type; /* type of file */
    char d_name[256]; /* filename */
};

Solution 8 - C++

Here is a very simple code in C++11 using boost::filesystem library to get file names in a directory (excluding folder names):

#include <string>
#include <iostream>
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;

int main()
{
    path p("D:/AnyFolder");
    for (auto i = directory_iterator(p); i != directory_iterator(); i++)
    {
        if (!is_directory(i->path())) //we eliminate directories
        {
            cout << i->path().filename().string() << endl;
        }
        else
            continue;
    }
}

Output is like:

file1.txt
file2.dat

Solution 9 - C++

Why not use glob()?

#include <glob.h>

glob_t glob_result;
glob("/your_directory/*",GLOB_TILDE,NULL,&glob_result);
for(unsigned int i=0; i<glob_result.gl_pathc; ++i){
  cout << glob_result.gl_pathv[i] << endl;
}

Solution 10 - C++

Try boost for x-platform method

http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm

or just use your OS specific file stuff.

Solution 11 - C++

Check out this class which uses the win32 api. Just construct an instance by providing the foldername from which you want the listing then call the getNextFile method to get the next filename from the directory. I think it needs windows.h and stdio.h.

class FileGetter{
	WIN32_FIND_DATAA found;	
	HANDLE hfind;
	char folderstar[255];		
	int chk;

public:
	FileGetter(char* folder){		
		sprintf(folderstar,"%s\\*.*",folder);
		hfind = FindFirstFileA(folderstar,&found);
		//skip .
		FindNextFileA(hfind,&found);		
	}

	int getNextFile(char* fname){
		//skips .. when called for the first time
		chk=FindNextFileA(hfind,&found);
		if (chk)
			strcpy(fname, found.cFileName);		
		return chk;
	}

};

Solution 12 - C++

GNU Manual FTW

http://www.gnu.org/software/libc/manual/html_node/Simple-Directory-Lister.html#Simple-Directory-Lister

Also, sometimes it's good to go right to the source (pun intended). You can learn a lot by looking at the innards of some of the most common commands in Linux. I've set up a simple mirror of GNU's coreutils on github (for reading).

https://github.com/homer6/gnu_coreutils/blob/master/src/ls.c

Maybe this doesn't address Windows, but a number of cases of using Unix variants can be had by using these methods.

Hope that helps...

Solution 13 - C++

Shreevardhan answer works great. But if you want to use it in c++14 just make a change namespace fs = experimental::filesystem;

i.e.,

#include <string>
#include <iostream>
#include <filesystem>

using namespace std;
namespace fs = experimental::filesystem;

int main()
{
	string path = "C:\\splits\\";
	for (auto & p : fs::directory_iterator(path))
		cout << p << endl;
	int n;
	cin >> n;
}

Solution 14 - C++

char **getKeys(char *data_dir, char* tablename, int *num_keys)
{
	char** arr = malloc(MAX_RECORDS_PER_TABLE*sizeof(char*));
int i = 0;
for (;i < MAX_RECORDS_PER_TABLE; i++)
	arr[i] = malloc( (MAX_KEY_LEN+1) * sizeof(char) );	


char *buf = (char *)malloc( (MAX_KEY_LEN+1)*sizeof(char) );
snprintf(buf, MAX_KEY_LEN+1, "%s/%s", data_dir, tablename);

DIR* tableDir = opendir(buf);
struct dirent* getInfo;

readdir(tableDir); // ignore '.'
readdir(tableDir); // ignore '..'

i = 0;
while(1)
{

	
	getInfo = readdir(tableDir);
	if (getInfo == 0)
		break;
	strcpy(arr[i++], getInfo->d_name);
}
*(num_keys) = i;
return arr;
}

Solution 15 - C++

I hope this code help you.

#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

string wchar_t2string(const wchar_t *wchar)
{
	string str = "";
	int index = 0;
	while(wchar[index] != 0)
	{
		str += (char)wchar[index];
		++index;
	}
	return str;
}

wchar_t *string2wchar_t(const string &str)
{
	wchar_t wchar[260];
	int index = 0;
	while(index < str.size())
	{
		wchar[index] = (wchar_t)str[index];
		++index;
	}
	wchar[index] = 0;
	return wchar;
}

vector<string> listFilesInDirectory(string directoryName)
{
	WIN32_FIND_DATA FindFileData;
	wchar_t * FileName = string2wchar_t(directoryName);
	HANDLE hFind = FindFirstFile(FileName, &FindFileData);
	
	vector<string> listFileNames;
	listFileNames.push_back(wchar_t2string(FindFileData.cFileName));

	while (FindNextFile(hFind, &FindFileData))
		listFileNames.push_back(wchar_t2string(FindFileData.cFileName));

	return listFileNames;
}

void main()
{
	vector<string> listFiles;
	listFiles = listFilesInDirectory("C:\\*.txt");
	for each (string str in listFiles)
		cout << str << endl;
}

Solution 16 - C++

System call it!

system( "dir /b /s /a-d * > file_names.txt" );

Then just read the file.

EDIT: This answer should be considered a hack, but it really does work (albeit in a platform specific way) if you don't have access to more elegant solutions.

Solution 17 - C++

This implementation realizes your purpose, dynamically filling an array of strings with the content of the specified directory.

int exploreDirectory(const char *dirpath, char ***list, int *numItems) {
    struct dirent **direntList;
    int i;
    errno = 0;

    if ((*numItems = scandir(dirpath, &direntList, NULL, alphasort)) == -1)
        return errno;

    if (!((*list) = malloc(sizeof(char *) * (*numItems)))) {
        fprintf(stderr, "Error in list allocation for file list: dirpath=%s.\n", dirpath);
        exit(EXIT_FAILURE);
    }

    for (i = 0; i < *numItems; i++) {
        (*list)[i] = stringDuplication(direntList[i]->d_name);
    }

    for (i = 0; i < *numItems; i++) {
        free(direntList[i]);
    }

    free(direntList);

    return 0;
}

Solution 18 - C++

#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main() {
    std::string path = "/path/to/directory";
    for (const auto & entry : fs::directory_iterator(path))
        std::cout << entry.path() << std::endl;
}

Solution 19 - C++

This works for me. I'm sorry if I cannot remember the source. It is probably from a man page.

#include <ftw.h>

int AnalizeDirectoryElement (const char *fpath, 
                            const struct stat *sb,
                            int tflag, 
                            struct FTW *ftwbuf) {

  if (tflag == FTW_F) {
    std::string strFileName(fpath);

    DoSomethingWith(strFileName);
  }
  return 0; 
}

void WalkDirectoryTree (const char * pchFileName) {

  int nFlags = 0;

  if (nftw(pchFileName, AnalizeDirectoryElement, 20, nFlags) == -1) {
    perror("nftw");
  }
}

int main() {
  WalkDirectoryTree("some_dir/");
}

Solution 20 - C++

you can get all direct of files in your root directory by using std::experimental:: filesystem::directory_iterator(). Then, read the name of these pathfiles.

#include <iostream>
#include <filesystem>
#include <string>
#include <direct.h>
using namespace std;
namespace fs = std::experimental::filesystem;
void ShowListFile(string path)
{
for(auto &p: fs::directory_iterator(path))  /*get directory */
     cout<<p.path().filename()<<endl;   // get file name
}

int main() {

ShowListFile("C:/Users/dell/Pictures/Camera Roll/");
getchar();
return 0;
}

Solution 21 - C++

This answer should work for Windows users that have had trouble getting this working with Visual Studio with any of the other answers.

  1. Download the dirent.h file from the github page. But is better to just use the Raw dirent.h file and follow my steps below (it is how I got it to work).

Github page for dirent.h for Windows: Github page for dirent.h

Raw Dirent File: Raw dirent.h File

  1. Go to your project and Add a new Item (Ctrl+Shift+A). Add a header file (.h) and name it dirent.h.

  2. Paste the Raw dirent.h File code into your header.

  3. Include "dirent.h" in your code.

  4. Put the below void filefinder() method in your code and call it from your main function or edit the function how you want to use it.

     #include <stdio.h>
     #include <string.h>
     #include "dirent.h"
    
     string path = "C:/folder"; //Put a valid path here for folder
    
     void filefinder()
     {
         DIR *directory = opendir(path.c_str());
         struct dirent *direntStruct;
    
         if (directory != NULL) {
     	    while (direntStruct = readdir(directory)) {
     		    printf("File Name: %s\n", direntStruct->d_name); //If you are using <stdio.h>
     		    //std::cout << direntStruct->d_name << std::endl; //If you are using <iostream>
     	    }
         }
         closedir(directory);
     }
    

Solution 22 - C++

Since files and sub directories of a directory are generally stored in a tree structure, an intuitive way is to use DFS algorithm to recursively traverse each of them. Here is an example in windows operating system by using basic file functions in io.h. You can replace these functions in other platform. What I want to express is that the basic idea of DFS perfectly meets this problem.

#include<io.h>
#include<iostream.h>
#include<string>
using namespace std;

void TraverseFilesUsingDFS(const string& folder_path){
   _finddata_t file_info;
   string any_file_pattern = folder_path + "\\*";
   intptr_t handle = _findfirst(any_file_pattern.c_str(),&file_info);
   //If folder_path exsist, using any_file_pattern will find at least two files "." and "..", 
   //of which "." means current dir and ".." means parent dir
   if (handle == -1){
       cerr << "folder path not exist: " << folder_path << endl;
	   exit(-1);
   }
   //iteratively check each file or sub_directory in current folder
   do{
       string file_name=file_info.name; //from char array to string
       //check whtether it is a sub direcotry or a file
	   if (file_info.attrib & _A_SUBDIR){
		    if (file_name != "." && file_name != ".."){
			   string sub_folder_path = folder_path + "\\" + file_name;				   
			   TraverseFilesUsingDFS(sub_folder_path);
               cout << "a sub_folder path: " << sub_folder_path << endl;
		    }
	   }
	   else
		    cout << "file name: " << file_name << endl;
    } while (_findnext(handle, &file_info) == 0);
    //
    _findclose(handle);
}

Solution 23 - C++

I tried to follow the example given in both answers and it might be worth noting that it appears as though std::filesystem::directory_entry has been changed to not have an overload of the << operator. Instead of std::cout << p << std::endl; I had to use the following to be able to compile and get it working:

#include <iostream>
#include <filesystem>
#include <string>
namespace fs = std::filesystem;

int main() {
    std::string path = "/path/to/directory";
    for(const auto& p : fs::directory_iterator(path))
        std::cout << p.path() << std::endl;
}

trying to pass p on its own to std::cout << resulted in a missing overload error.

Solution 24 - C++

Building on what herohuyongtao posted and a few other posts:

http://www.cplusplus.com/forum/general/39766/

https://stackoverflow.com/questions/17534946/what-is-the-expected-input-type-of-findfirstfile

https://stackoverflow.com/questions/4804298/how-to-convert-wstring-into-string

This is a Windows solution.

Since I wanted to pass in std::string and return a vector of strings I had to make a couple conversions.

#include <string>
#include <Windows.h>
#include <vector>
#include <locale>
#include <codecvt>

std::vector<std::string> listFilesInDir(std::string path)
{
    std::vector<std::string> names;
    //Convert string to wstring
    std::wstring search_path = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(path);
    WIN32_FIND_DATA fd;
    HANDLE hFind = FindFirstFile(search_path.c_str(), &fd);
    if (hFind != INVALID_HANDLE_VALUE) 
    {
	    do 
	    {
		    // read all (real) files in current folder
		    // , delete '!' read other 2 default folder . and ..
		    if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
		    {
			    //convert from wide char to narrow char array
			    char ch[260];
			    char DefChar = ' ';
			    WideCharToMultiByte(CP_ACP, 0, fd.cFileName, -1, ch, 260, &DefChar, NULL);
			    names.push_back(ch);
		    }
	    } 
	    while (::FindNextFile(hFind, &fd));
	    ::FindClose(hFind);
    }
    return names;
}

Solution 25 - C++

Just something that I want to share and thank you for the reading material. Play around with the function for a bit to understand it. You may like it. e stood for extension, p is for path, and s is for path separator.

If the path is passed without ending separator, a separator will be appended to the path. For the extension, if an empty string is inputted then the function will return any file that does not have an extension in its name. If a single star was inputted than all files in the directory will be returned. If e length is greater than 0 but is not a single * then a dot will be prepended to e if e had not contained a dot at the zero position.

For a returning value. If a zero-length map is returned then nothing was found but the directory was open okay. If index 999 is available from the return value but the map size is only 1 then that meant there was a problem with opening the directory path.

Note that for efficiency, this function can be split into 3 smaller functions. On top of that, you can create a caller function that will detect which function it is going to call based on the input. Why is that more efficient? Said if you are going to grab everything that is a file, doing that method the subfunction that built for grabbing all the files will just grab all that are files and does not need to evaluate any other unnecessary condition everytime it found a file.

That would also apply to when you grab files that do not have an extension. A specific built function for that purpose would only evaluate for weather if the object found is a file and then whether or not if the name of the file has a dot in it.

The saving may not be much if you only read directories with not so much files. But if you are reading a mass amount of directory or if the directory has couple hundred thousands of files, it could be a huge saving.

#include <stdio.h>
#include <sys/stat.h>
#include <iostream>
#include <dirent.h>
#include <map>

std::map<int, std::string> getFile(std::string p, std::string e = "", unsigned char s = '/'){
    if ( p.size() > 0 ){
        if (p.back() != s) p += s;
    }
    if ( e.size() > 0 ){
        if ( e.at(0) != '.' && !(e.size() == 1 && e.at(0) == '*') ) e = "." + e;
    }

    DIR *dir;
    struct dirent *ent;
    struct stat sb;
    std::map<int, std::string> r = {{999, "FAILED"}};
    std::string temp;
    int f = 0;
    bool fd;

    if ( (dir = opendir(p.c_str())) != NULL ){
        r.erase (999);
        while ((ent = readdir (dir)) != NULL){
            temp = ent->d_name;
            fd = temp.find(".") != std::string::npos? true : false;
            temp = p + temp;

            if (stat(temp.c_str(), &sb) == 0 && S_ISREG(sb.st_mode)){
                if ( e.size() == 1 && e.at(0) == '*' ){
                    r[f] = temp;
                    f++;
                } else {
                    if (e.size() == 0){
                        if ( fd == false ){
                            r[f] = temp;
                            f++;
                        }
                        continue;
                    }

                    if (e.size() > temp.size()) continue;

                    if ( temp.substr(temp.size() - e.size()) == e ){
                        r[f] = temp;
                        f++;
                    }
                }
            }
        }

        closedir(dir);
        return r;
    } else {
        return r;
    }
}

void printMap(auto &m){
    for (const auto &p : m) {
        std::cout << "m[" << p.first << "] = " << p.second << std::endl;
    }
}

int main(){
    std::map<int, std::string> k = getFile("./", "");
    printMap(k);
    return 0;
}

Solution 26 - C++

#include<iostream>
#include <dirent.h>
using namespace std;
char ROOT[]={'.'};

void listfiles(char* path){
    DIR * dirp = opendir(path);
    dirent * dp;
    while ( (dp = readdir(dirp)) !=NULL ) {
         cout << dp->d_name << " size " << dp->d_reclen<<std::endl;
    }
    (void)closedir(dirp);
}

int main(int argc, char **argv)
{
    char* path;
    if (argc>1) path=argv[1]; else path=ROOT;

    cout<<"list files in ["<<path<<"]"<<std::endl;
    listfiles(path);

    return 0;
}

Solution 27 - C++

Try scandir() from dirent.h

man scandir()

Solution 28 - C++

Based on the answers above

#include <vector>
#include <string>
#include <algorithm>

#ifdef _WIN32
#include <windows.h>
std::vector<std::string> files_in_directory(std::string path)
{
    std::vector<std::string> files;

    // check directory exists
    char fullpath[MAX_PATH];
    GetFullPathName(path.c_str(), MAX_PATH, fullpath, 0);
    std::string fp(fullpath);
    if (GetFileAttributes(fp.c_str()) != FILE_ATTRIBUTE_DIRECTORY)
        return files;

    // get file names
    WIN32_FIND_DATA findfiledata;
    HANDLE hFind = FindFirstFile((LPCSTR)(fp + "\\*").c_str(), &findfiledata);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        do 
        {
            files.push_back(findfiledata.cFileName);
        } 
        while (FindNextFile(hFind, &findfiledata));
        FindClose(hFind);
    }

    // delete current and parent directories
    files.erase(std::find(files.begin(), files.end(), "."));
    files.erase(std::find(files.begin(), files.end(), ".."));

    // sort in alphabetical order
    std::sort(files.begin(), files.end());

    return files;
}
#else
#include <dirent.h>
std::vector<std::string> files_in_directory(std::string directory)
{
    std::vector<std::string> files;

    // open directory
    DIR *dir;
    dir = opendir(directory.c_str());
    if (dir == NULL)
        return files;

    // get file names
    struct dirent *ent;
    while ((ent = readdir(dir)) != NULL)
        files.push_back(ent->d_name);
    closedir(dir);

    // delete current and parent directories
    files.erase(std::find(files.begin(), files.end(), "."));
    files.erase(std::find(files.begin(), files.end(), ".."));

    // sort in alphabetical order
    std::sort(files.begin(), files.end());

    return files;
}
#endif  // _WIN32

Solution 29 - C++

Shreevardhan's design also works great for traversing subdirectories:

#include <string>
#include <iostream>
#include <filesystem>

using namespace std;
namespace fs = filesystem;
int main()
{
    string path = "\\path\\to\\directory";
    // string path = "/path/to/directory";
    for (auto & p : fs::recursive_directory_iterator(path))
        cout << p.path() << endl;
}

Compilation: cl /EHsc /W4 /WX /std:c++17 ListFiles.cpp

Solution 30 - C++

This worked for me. It writes a file with just the names (no path) of all the files. Then it reads that txt file and prints it for you.

void DisplayFolderContent()
    {

        system("dir /n /b * > file_names.txt");
        char ch;
        std::fstream myStream("file_names.txt", std::fstream::in);
        while (myStream.get(ch))
        {
            std::cout << ch;
        }

    }

Solution 31 - C++

Contribution to Cesar Alejandro Montero Orozco answer.

There is beauty in simplicity, and by adding the /s key, we also go through subdirectories.

system("dir /n /b /s * > file_names.txt");

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsamozView Question on Stackoverflow
Solution 1 - C++Peter ParkerView Answer on Stackoverflow
Solution 2 - C++ShreevardhanView Answer on Stackoverflow
Solution 3 - C++Brian R. BondyView Answer on Stackoverflow
Solution 4 - C++herohuyongtaoView Answer on Stackoverflow
Solution 5 - C++congusbongusView Answer on Stackoverflow
Solution 6 - C++Chris RedfordView Answer on Stackoverflow
Solution 7 - C++ShrikantView Answer on Stackoverflow
Solution 8 - C++BadView Answer on Stackoverflow
Solution 9 - C++MeekohiView Answer on Stackoverflow
Solution 10 - C++TimView Answer on Stackoverflow
Solution 11 - C++robertvargaView Answer on Stackoverflow
Solution 12 - C++Homer6View Answer on Stackoverflow
Solution 13 - C++Venkat VinayView Answer on Stackoverflow
Solution 14 - C++JasonYen2205View Answer on Stackoverflow
Solution 15 - C++YasView Answer on Stackoverflow
Solution 16 - C++CatalystView Answer on Stackoverflow
Solution 17 - C++Giacomo MarcianiView Answer on Stackoverflow
Solution 18 - C++3ashryView Answer on Stackoverflow
Solution 19 - C++ENHeringView Answer on Stackoverflow
Solution 20 - C++ducPhamView Answer on Stackoverflow
Solution 21 - C++ZKRView Answer on Stackoverflow
Solution 22 - C++tkingcerView Answer on Stackoverflow
Solution 23 - C++OpticalMagicianView Answer on Stackoverflow
Solution 24 - C++tzgView Answer on Stackoverflow
Solution 25 - C++Kevin NgView Answer on Stackoverflow
Solution 26 - C++Stan SokolovView Answer on Stackoverflow
Solution 27 - C++user14347980View Answer on Stackoverflow
Solution 28 - C++BurakView Answer on Stackoverflow
Solution 29 - C++jarikmesikView Answer on Stackoverflow
Solution 30 - C++Cesar Alejandro Montero OrozcoView Answer on Stackoverflow
Solution 31 - C++jarikmesikView Answer on Stackoverflow