diff --git a/components/vfs/filesystemarchive.cpp b/components/vfs/filesystemarchive.cpp index b8374eaba9..01e5c2a1b5 100644 --- a/components/vfs/filesystemarchive.cpp +++ b/components/vfs/filesystemarchive.cpp @@ -20,21 +20,36 @@ namespace VFS if (prefix > 0 && str[prefix - 1] != '\\' && str[prefix - 1] != '/') ++prefix; - for (const auto& i : std::filesystem::recursive_directory_iterator(mPath)) + std::filesystem::recursive_directory_iterator iterator(mPath); + + for (auto it = std::filesystem::begin(iterator), end = std::filesystem::end(iterator); it != end;) { - if (std::filesystem::is_directory(i)) - continue; - - const std::filesystem::path& filePath = i.path(); - const std::string proper = Files::pathToUnicodeString(filePath); - VFS::Path::Normalized searchable(std::string_view{ proper }.substr(prefix)); - FileSystemArchiveFile file(filePath); - - const auto inserted = mIndex.emplace(std::move(searchable), std::move(file)); - if (!inserted.second) - Log(Debug::Warning) - << "Found duplicate file for '" << proper - << "', please check your file system for two files with the same name in different cases."; + const auto& i = *it; + + if (!std::filesystem::is_directory(i)) + { + const std::filesystem::path& filePath = i.path(); + const std::string proper = Files::pathToUnicodeString(filePath); + VFS::Path::Normalized searchable(std::string_view{ proper }.substr(prefix)); + FileSystemArchiveFile file(filePath); + + const auto inserted = mIndex.emplace(std::move(searchable), std::move(file)); + if (!inserted.second) + Log(Debug::Warning) + << "Found duplicate file for '" << proper + << "', please check your file system for two files with the same name in different cases."; + } + + // Exception thrown by the operator++ may not contain the context of the error like what exact path caused + // the problem which makes it hard to understand what's going on when iteration happens over a directory + // with thousands of files and subdirectories. + const std::filesystem::path prevPath = i.path(); + std::error_code ec; + it.increment(ec); + if (ec != std::error_code()) + throw std::runtime_error("Failed to recursively iterate over \"" + Files::pathToUnicodeString(mPath) + + "\" when incrementing to the next item from \"" + Files::pathToUnicodeString(prevPath) + + "\": " + ec.message()); } }