This is a program that does a directory tree listing using asynchronous tasks in C++.
my problem is in each function call the variable 'vect' is created as a local variable and in each function call, we have a list of files in a directory but at the end all the files in all the directories are returned into the main! how is it possible?
I mean how come the 'vect' variable which is a local variable to each function call, keeps the file name of each directory generated by a separate function call?! this 'vect' acts like it is a global variable. Is it because of "std::copy"? I don't understand it!
#include <algorithm>
#include <filesystem>
#include <future>
#include <iostream>
#include <vector>
typedef std::vector<std::filesystem::directory_entry> vectDirEntry;
vectDirEntry ListDirectory2(std::filesystem::directory_entry&& dirPath)
{
std::vector<std::future<std::vector<std::filesystem::directory_entry>>> finalVect;
vectDirEntry vect;
for (const std::filesystem::directory_entry& entry : std::filesystem::directory_iterator(dirPath))
{
if (entry.is_directory())
{
std::future<vectDirEntry> fut = std::async(std::launch::async, &ListDirectory2, entry);
finalVect.push_back(std::move(fut));
}
else if (entry.is_regular_file())
{
vect.push_back(entry);
}
}
std::for_each(finalVect.begin(), finalVect.end(), [&](std::future<std::vector<std::filesystem::directory_entry>>& fut)
{
vectDirEntry lst = fut.get();
std::copy(lst.begin(), lst.end(), std::back_inserter(vect));
}
);
return vect;
}
int main()
{
const std::filesystem::directory_entry root = std::filesystem::directory_entry("C:/Test");
std::future<std::vector<std::filesystem::directory_entry>> fut = std::async(std::launch::async, &ListDirectory2, root);
auto result = fut.get();
for (std::filesystem::directory_entry& item : result)
{
std::cout << item << '\n';
}
}