Coder Asker Coder Asker - 21 days ago 5x
C Question

List folders, sub folders and files in a given path in C (windows)

Is there a way to list all folders, sub folders and files in a given path ? for example like: (c:\myfolder), and print full path for each file and folder contained on it ?


I found this example but designed only for linux:

int is_directory_we_want_to_list(const char *parent, char *name) {
struct stat st_buf;
if (!strcmp(".", name) || !strcmp("..", name))
return 0;

char *path = alloca(strlen(name) + strlen(parent) + 2);
sprintf(path, "%s/%s", parent, name);
stat(path, &st_buf);
return S_ISDIR(st_buf.st_mode);

int list(const char *name) {
DIR *dir = opendir(name);
struct dirent *ent;

while (ent = readdir(dir)) {
char *entry_name = ent->d_name;
printf("%s\n", entry_name);

if (is_directory_we_want_to_list(name, entry_name)) {
// You can consider using alloca instead.
char *next = malloc(strlen(name) + strlen(entry_name) + 2);
sprintf(next, "%s/%s", name, entry_name);


Source: How to recursively list directories in C on LINUX


As suggested by @purplepsycho, the simplest way is to use FindFirstFile, FindNextFile and FileClose.

But there are some differences anyway from the Unix version: you must search for a name like folder\* instead of browsing the directory, FindFirstFile gives first name, and you get the other ones with FindNextFile.

Here is a full code example:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

#ifdef UNICODE
#define fmt "%S"
#define fmt "%s"

void process_file(LPCTSTR filename) {
    // TODO: implement actual file processing
    printf(fmt, filename);
    fputs("\n", stdout);

void process_folder(LPCTSTR foldername) {
    WIN32_FIND_DATA findFileData;
    HANDLE handle;
    LPTSTR newfolder = malloc(sizeof(TCHAR) *(_tcslen(foldername) + 3));  // add some room for the additional \*
    _tcscpy(newfolder, foldername);
    _tcscat(newfolder, _T("\\*"));
    handle = FindFirstFile(newfolder, &findFileData);
    if (handle != INVALID_HANDLE_VALUE) {
        while(1) {
            // skip . and .. to avoid infinite recursion
            if ((_tccmp(findFileData.cFileName, _T(".")) != 0) && (_tccmp(findFileData.cFileName, _T("..")) != 0)) {
                // compute name as folder\filename
                LPTSTR newname = malloc(sizeof(TCHAR) * (_tcslen(foldername) + _tcslen(findFileData.cFileName) + 2));
                _tcscpy(newname, foldername);
                _tcscat(newname, _T("\\"));
                _tcscat(newname, findFileData.cFileName);
                if ((findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
                    process_folder(newname); // recurse if is is a directory
                else {
                    process_file(newname);  // process other files
                free(newname);  // consistenly free any malloc
            if (FindNextFile(handle, &findFileData) == FALSE) break; // exit the loop when folder is exhausted

int _tmain(int argc, TCHAR *argv[]) {
    if (argc != 2) {
        fputs("Usage: ", stderr);
        fprintf(stderr, fmt, argv[0]);
        fputs(" top_folder\n", stderr);
        return 1;
    return 0;

Above code still lacks some error condition processing, but is an example of recursive use of Find{First|Next}File on Windows.