From 9a88975606048ad6643439310bde8f8535c14ea5 Mon Sep 17 00:00:00 2001 From: wangrong Date: Thu, 21 Aug 2025 13:30:12 +0800 Subject: [PATCH] Handle file enumeration exceptions in FileUtils::listDirectory - If `boost::filesystem::directory_entry::status` fails, return false instead of throwing a `boost::filesystem::filesystem_error` exception. - During file enumeration, if an `ENOENT` error occurs, re-enumerate all directory entries to increase robustness. --- src/core/util/FileUtils.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/core/util/FileUtils.cpp b/src/core/util/FileUtils.cpp index d92efbb8..dd6e0489 100644 --- a/src/core/util/FileUtils.cpp +++ b/src/core/util/FileUtils.cpp @@ -93,17 +93,29 @@ bool isDirectory(const String& path) { bool listDirectory(const String& path, bool filesOnly, HashSet dirList) { boost::system::error_code ec; - boost::filesystem::directory_iterator dir(path.c_str(), ec); - if (ec) { - return false; - } - for (; dir != boost::filesystem::directory_iterator(); ++dir) { - if (!filesOnly || !boost::filesystem::is_directory(dir->status())) { + do { + ec.clear(); + boost::filesystem::directory_iterator dir(path.c_str(), ec); + if (ec) { + break; + } + + for (; dir != boost::filesystem::directory_iterator(); ++dir) { + if (filesOnly) { + bool is_dir = boost::filesystem::is_directory(dir->status(ec)); + if (ec) { + dirList.clear(); + break; + } else if (is_dir) { + continue; + } + } dirList.add(dir->path().filename().wstring().c_str()); } - } - return true; + } while (ec == boost::system::error_code(ENOENT, boost::system::system_category())); + + return !ec; } bool copyDirectory(const String& source, const String& dest) {