/*! * List entries of a directory. * @param entries A string vector containing the result * @param dir Target directory for listing * @param bInclDirs Boolean flag to include directories in the result * @param bInclFiles Boolean flag to include regular files in the result */ void DirectoryListing(std::vector<std::string>& entries, const std::string &dir, bool bInclDirs, bool bInclFiles) { DIR *d = NULL; struct dirent *ent; if ((d = opendir(dir.c_str())) != NULL) { while ((ent = readdir(d)) != NULL) { std::string name = ent->d_name; if (bInclDirs && dirent_is_directory(dir, ent) && name != "." && name != "..") { entries.push_back(name); continue; } if (bInclFiles && dirent_is_file(dir, ent)) { entries.push_back(name); continue; } } closedir(d); } return; }
/** * dir_list_new: * @dir : directory path. * @ext : allowed extensions of file directory entries to include. * @include_dirs : include directories as part of the finished directory listing? * * Create a directory listing. * * Returns: pointer to a directory listing of type 'struct string_list *' on success, * NULL in case of error. Has to be freed manually. **/ struct string_list *dir_list_new(const char *dir, const char *ext, bool include_dirs) { #ifdef _WIN32 WIN32_FIND_DATA ffd; HANDLE hFind = INVALID_HANDLE_VALUE; #else DIR *directory = NULL; const struct dirent *entry = NULL; #endif char path_buf[PATH_MAX_LENGTH] = {0}; struct string_list *ext_list = NULL; struct string_list *list = NULL; (void)path_buf; if (!(list = string_list_new())) return NULL; if (ext) ext_list = string_split(ext, "|"); #ifdef _WIN32 snprintf(path_buf, sizeof(path_buf), "%s\\*", dir); hFind = FindFirstFile(path_buf, &ffd); if (hFind == INVALID_HANDLE_VALUE) goto error; do { char file_path[PATH_MAX_LENGTH]; int ret = 0; const char *name = ffd.cFileName; const char *file_ext = path_get_extension(name); bool is_dir = ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; fill_pathname_join(file_path, dir, name, sizeof(file_path)); ret = parse_dir_entry(name, file_path, is_dir, include_dirs, list, ext_list, file_ext); if (ret == -1) goto error; if (ret == 1) continue; }while (FindNextFile(hFind, &ffd) != 0); FindClose(hFind); string_list_free(ext_list); return list; error: if (hFind != INVALID_HANDLE_VALUE) FindClose(hFind); #else directory = opendir(dir); if (!directory) goto error; while ((entry = readdir(directory))) { char file_path[PATH_MAX_LENGTH]; int ret = 0; const char *name = entry->d_name; const char *file_ext = path_get_extension(name); bool is_dir = false; fill_pathname_join(file_path, dir, name, sizeof(file_path)); is_dir = dirent_is_directory(file_path, entry); ret = parse_dir_entry(name, file_path, is_dir, include_dirs, list, ext_list, file_ext); if (ret == -1) goto error; if (ret == 1) continue; } closedir(directory); string_list_free(ext_list); return list; error: if (directory) closedir(directory); #endif string_list_free(list); string_list_free(ext_list); return NULL; }