How to list subdirectories in Windows using C ++?

How can I list subdirectories in windows using C ++? Using code that could use cross-platorm is better.

+7
source share
5 answers
+4
source

Here is my solution to the problem - it is only a Windows solution. I want to use a cross-platform solution, but not using boost.

#include <Windows.h> #include <vector> #include <string> /// Gets a list of subdirectories under a specified path /// @param[out] output Empty vector to be filled with result /// @param[in] path Input path, may be a relative path from working dir void getSubdirs(std::vector<std::string>& output, const std::string& path) { WIN32_FIND_DATA findfiledata; HANDLE hFind = INVALID_HANDLE_VALUE; char fullpath[MAX_PATH]; GetFullPathName(path.c_str(), MAX_PATH, fullpath, 0); std::string fp(fullpath); hFind = FindFirstFile((LPCSTR)(fp + "\\*").c_str(), &findfiledata); if (hFind != INVALID_HANDLE_VALUE) { do { if ((findfiledata.dwFileAttributes | FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY && (findfiledata.cFileName[0] != '.')) { output.push_back(findfiledata.cFileName); } } while (FindNextFile(hFind, &findfiledata) != 0); } } /// Gets a list of subdirectory and their subdirs under a specified path /// @param[out] output Empty vector to be filled with result /// @param[in] path Input path, may be a relative path from working dir /// @param[in] prependStr String to be pre-appended before each result /// for top level path, this should be an empty string void getSubdirsRecursive(std::vector<std::string>& output, const std::string& path, const std::string& prependStr) { std::vector<std::string> firstLvl; getSubdirs(firstLvl, path); for (std::vector<std::string>::iterator i = firstLvl.begin(); i != firstLvl.end(); ++i) { output.push_back(prependStr + *i); getSubdirsRecursive(output, path + std::string("\\") + *i + std::string("\\"), prependStr + *i + std::string("\\")); } } 
+3
source

Here's a relatively good solution that should work on a cross platform. You will need to change the section of code in which you want to do something, but otherwise it should work quite well.

 #include <cstring> #include <io.h> #include <iostream> #include <stdio.h> using namespace std; void list(char* dir) { char originalDirectory[_MAX_PATH]; // Get the current directory so we can return to it _getcwd(originalDirectory, _MAX_PATH); _chdir(dir); // Change to the working directory _finddata_t fileinfo; // This will grab the first file in the directory // "*" can be changed if you only want to look for specific files intptr_t handle = _findfirst("*", &fileinfo); if(handle == -1) // No files or directories found { perror("Error searching for file"); exit(1); } do { if(strcmp(fileinfo.name, ".") == 0 || strcmp(fileinfo.name, "..") == 0) continue; if(fileinfo.attrib & _A_SUBDIR) // Use bitmask to see if this is a directory cout << "This is a directory." << endl; else cout << "This is a file." << endl; } while(_findnext(handle, &fileinfo) == 0); _findclose(handle); // Close the stream _chdir(originalDirectory); } int main() { list("C:\\"); return 0; } 

This is fairly concise code and will list all the subdirectories and files in the directory. If you want it to display all the contents in each subdirectory, you can call the function recursively by passing it to the subdirectory on the line that displays "This is a directory." Something like a list (fileinfo.name); gotta do the trick.

+3
source

Check out the Boost.Filesystem . It is cross platform and free.

+2
source

You can use a chest bit. More details here

0
source

All Articles