#include #include #include #include "dirent.h" void _getFileName(DIRSTR *dirlist, WIN32_FIND_DATA *winFileData) { // get leaf if directory name is given char *leafname = strrchr(winFileData->cFileName, '\\'); if (leafname) { leafname ++; } else { leafname = winFileData->cFileName; } strcpy(dirlist->fileData.d_name, leafname); } DIRSTR *opendir(const char *name) { char buffer[MAX_PATH]; WIN32_FIND_DATA winFileData; DIRSTR *newlist = (DIRSTR *) malloc(sizeof(DIRSTR)); strcpy(buffer, name); if (buffer[strlen(buffer)-1] != '\\') { strcat(buffer, "\\*"); } else { strcat(buffer, "*"); } newlist->searchHandle = FindFirstFile(buffer, &winFileData); if (newlist->searchHandle == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); if (error == ERROR_NO_MORE_FILES) { newlist->first = 2; } else { free(newlist); newlist = NULL; } } else { _getFileName(newlist, &winFileData); newlist->first = 1; } return newlist; } dirent *readdir(DIRSTR *dirlist) { if (dirlist->first == 2) { // empty directory return NULL; } else if (dirlist->first != 1) { WIN32_FIND_DATA winFileData; if (FindNextFile(dirlist->searchHandle, &winFileData) == 0) { DWORD error = GetLastError(); return NULL; } else { _getFileName(dirlist, &winFileData); } } else { dirlist->first = 0; } return &dirlist->fileData; } void closedir(DIRSTR *dirlist) { FindClose(dirlist->searchHandle); free(dirlist); }