in cppwinrt/cmd_reader.h [395:487]
auto files(std::string_view const& name, F directory_filter) const
{
std::set<std::string> files;
auto add_directory = [&](auto&& path)
{
for (auto&& file : std::filesystem::directory_iterator(path))
{
if (std::filesystem::is_regular_file(file))
{
auto filename = file.path().string();
if (directory_filter(filename))
{
files.insert(filename);
}
}
}
};
for (auto&& path : values(name))
{
if (std::filesystem::is_directory(path))
{
add_directory(std::filesystem::canonical(path));
continue;
}
if (std::filesystem::is_regular_file(path))
{
files.insert(std::filesystem::canonical(path).string());
continue;
}
if (path == "local")
{
std::array<char, 260> local{};
#ifdef _WIN64
ExpandEnvironmentStringsA("%windir%\\System32\\WinMetadata", local.data(), static_cast<uint32_t>(local.size()));
#else
ExpandEnvironmentStringsA("%windir%\\SysNative\\WinMetadata", local.data(), static_cast<uint32_t>(local.size()));
#endif
add_directory(local.data());
continue;
}
std::string sdk_version;
if (path == "sdk" || path == "sdk+")
{
sdk_version = get_sdk_version();
}
else
{
std::regex rx(R"(((\d+)\.(\d+)\.(\d+)\.(\d+))\+?)");
std::smatch match;
if (std::regex_match(path, match, rx))
{
sdk_version = match[1].str();
}
}
if (!sdk_version.empty())
{
auto sdk_path = get_sdk_path();
auto xml_path = sdk_path;
xml_path /= L"Platforms\\UAP";
xml_path /= sdk_version;
xml_path /= L"Platform.xml";
add_files_from_xml(files, sdk_version, xml_path, sdk_path);
if (path.back() != '+')
{
continue;
}
for (auto&& item : std::filesystem::directory_iterator(sdk_path / L"Extension SDKs"))
{
xml_path = item.path() / sdk_version;
xml_path /= L"SDKManifest.xml";
add_files_from_xml(files, sdk_version, xml_path, sdk_path);
}
continue;
}
throw_invalid("Path '", path, "' is not a file or directory");
}
return files;
}