diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index 1add7616c61..5fce5d16d57 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -546,8 +546,10 @@ bool Utility::Glob(const String& pathSpec, const std::function& callback, int type) +bool Utility::GlobRecursive(const String& path, const String& pattern, const std::function& callback, + int type, const std::function& onError) { std::vector files, dirs, alldirs; @@ -565,10 +567,18 @@ bool Utility::GlobRecursive(const String& path, const String& pattern, const std if (errorCode == ERROR_FILE_NOT_FOUND) return false; - BOOST_THROW_EXCEPTION(win32_error() - << boost::errinfo_api_function("FindFirstFile") - << errinfo_win32_error(errorCode) - << boost::errinfo_file_name(pathSpec)); + try { + BOOST_THROW_EXCEPTION(win32_error() + << boost::errinfo_api_function("FindFirstFile") + << errinfo_win32_error(errorCode) + << boost::errinfo_file_name(pathSpec)); + } catch (const std::exception& ex) { + if (onError && onError(ex)) { + return false; + } + + throw; + } } do { @@ -600,11 +610,20 @@ bool Utility::GlobRecursive(const String& path, const String& pattern, const std dirp = opendir(path.CStr()); - if (!dirp) - BOOST_THROW_EXCEPTION(posix_error() - << boost::errinfo_api_function("opendir") - << boost::errinfo_errno(errno) - << boost::errinfo_file_name(path)); + if (!dirp) { + try { + BOOST_THROW_EXCEPTION(posix_error() + << boost::errinfo_api_function("opendir") + << boost::errinfo_errno(errno) + << boost::errinfo_file_name(path)); + } catch (const std::exception& ex) { + if (onError && onError(ex)) { + return false; + } + + throw; + } + } while (dirp) { dirent *pent; @@ -662,7 +681,7 @@ bool Utility::GlobRecursive(const String& path, const String& pattern, const std std::sort(alldirs.begin(), alldirs.end()); for (const String& cpath : alldirs) { - GlobRecursive(cpath, pattern, callback, type); + GlobRecursive(cpath, pattern, callback, type, onError); } return true; diff --git a/lib/base/utility.hpp b/lib/base/utility.hpp index 4505dc918a5..f8fd4040e1e 100644 --- a/lib/base/utility.hpp +++ b/lib/base/utility.hpp @@ -65,7 +65,8 @@ class Utility static String NewUniqueID(); static bool Glob(const String& pathSpec, const std::function& callback, int type = GlobFile | GlobDirectory); - static bool GlobRecursive(const String& path, const String& pattern, const std::function& callback, int type = GlobFile | GlobDirectory); + static bool GlobRecursive(const String& path, const String& pattern, const std::function& callback, + int type = GlobFile | GlobDirectory, const std::function& onError = {}); static void MkDir(const String& path, int mode); static void MkDirP(const String& path, int mode); static bool SetFileOwnership(const String& file, const String& user, const String& group);