I know about FindFirstFile/FindNextFile, so how can i display along the path, for example, C:\Program Files\, all folders and all files enclosed within them, in general, all directories and files along this path. Using only WinAPI + FindFirstFile/FindNextFile, without Boost/Filesystem/dirent.h and etc. Looks like a recursion output with dirent.h, such as:
Code:
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include "iostream"
#include "string"
#include <windows.h>
#include <fstream>
using namespace std;
void listFilesRecursively(char *path);
int main()
{
setlocale(LC_ALL , "Russian");
char path[100];
printf("Enter path to list files: ");
scanf("%s", path);
listFilesRecursively(path);
return 0;
}
void listFilesRecursively(char *basePath)
{
WIN32_FILE_ATTRIBUTE_DATA Info;
char path[1000];
struct dirent *dp;
DIR *dir = opendir(basePath);
if (!dir)
return;
while ((dp = readdir(dir)) != NULL)
{
if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0)
{
printf("%s\n", dp->d_name);
strcpy(path, basePath);
strcat(path, "/");
strcat(path, dp->d_name);
string path_s = (const char*) path;
GetFileAttributesEx(path_s.c_str(), GetFileExInfoStandard, &Info);
cout<<Info.nFileSizeLow<<endl;
listFilesRecursively(path);
}
}
closedir(dir);
}
But how to do this using only WinAPI?
I tried like this:
Code:
#include <Windows.h>
#include <iostream>
#include <string>
#include <vector>
void FindFile(const std::wstring &directory)
{
std::wstring tmp = directory + L"\\*";
WIN32_FIND_DATAW file;
HANDLE search_handle = FindFirstFileW(tmp.c_str(), &file);
if (search_handle != INVALID_HANDLE_VALUE)
{
std::vector<std::wstring> directories;
do
{
if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if ((!lstrcmpW(file.cFileName, L".")) || (!lstrcmpW(file.cFileName, L"..")))
continue;
}
tmp = directory + L"\\" + std::wstring(file.cFileName);
std::wcout << tmp << std::endl;
if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
directories.push_back(tmp);
}
while (FindNextFileW(search_handle, &file));
FindClose(search_handle);
for(std::vector<std::wstring>::iterator iter = directories.begin(), end = directories.end(); iter != end; ++iter)
FindFile(*iter);
}
}
int main()
{
FindFile(L"C:");
return 0;
}
But it only displays if the path is in the form of "C:" and does not display subfolders with files.