Browse Source

Add system::glob().

tags/v2.5.2
Andrew Belt 6 months ago
parent
commit
dcbece868f
2 changed files with 21 additions and 0 deletions
  1. +4
    -0
      include/system.hpp
  2. +17
    -0
      src/system.cpp

+ 4
- 0
include/system.hpp View File

@@ -24,6 +24,10 @@ std::string join(const std::string& path1, const std::string& path2, Paths... pa
`depth` is the number of directories to recurse. 0 depth does not recurse. -1 depth recurses infinitely. `depth` is the number of directories to recurse. 0 depth does not recurse. -1 depth recurses infinitely.
*/ */
std::vector<std::string> getEntries(const std::string& dirPath, int depth = 0); std::vector<std::string> getEntries(const std::string& dirPath, int depth = 0);
/** Expands a glob pattern such as `dir/file*.txt` to a list of paths.
Paths are sorted.
*/
std::vector<std::string> glob(const std::string& pattern);
bool exists(const std::string& path); bool exists(const std::string& path);
/** Returns whether the given path is a file. */ /** Returns whether the given path is a file. */
bool isFile(const std::string& path); bool isFile(const std::string& path);


+ 17
- 0
src/system.cpp View File

@@ -9,6 +9,7 @@
#include <dirent.h> #include <dirent.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <cxxabi.h> // for abi::__cxa_demangle #include <cxxabi.h> // for abi::__cxa_demangle
#include <glob.h>


#if defined ARCH_LIN || defined ARCH_MAC #if defined ARCH_LIN || defined ARCH_MAC
#include <pthread.h> #include <pthread.h>
@@ -88,6 +89,22 @@ std::vector<std::string> getEntries(const std::string& dirPath, int depth) {
} }




std::vector<std::string> glob(const std::string& pattern) {
glob_t glob_result;
memset(&glob_result, 0, sizeof(glob_result));
std::vector<std::string> paths;

if (!glob(pattern.c_str(), GLOB_BRACE, NULL, &glob_result)) {
for (size_t i = 0; i < glob_result.gl_pathc; i++) {
paths.push_back(std::string(glob_result.gl_pathv[i]));
}
}

globfree(&glob_result);
return paths;
}


bool exists(const std::string& path) { bool exists(const std::string& path) {
try { try {
return fs::exists(fs::u8path(path)); return fs::exists(fs::u8path(path));


Loading…
Cancel
Save