mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-28 17:09:41 +00:00
Merge branch 'init_filesystem_archive' into 'master'
Initialize FileSystemArchive index in constructor See merge request OpenMW/openmw!3870
This commit is contained in:
commit
a297a0e742
2 changed files with 25 additions and 38 deletions
|
@ -12,48 +12,36 @@ namespace VFS
|
||||||
{
|
{
|
||||||
|
|
||||||
FileSystemArchive::FileSystemArchive(const std::filesystem::path& path)
|
FileSystemArchive::FileSystemArchive(const std::filesystem::path& path)
|
||||||
: mBuiltIndex(false)
|
: mPath(path)
|
||||||
, mPath(path)
|
|
||||||
{
|
{
|
||||||
|
const auto str = mPath.u8string();
|
||||||
|
std::size_t prefix = str.size();
|
||||||
|
|
||||||
|
if (prefix > 0 && str[prefix - 1] != '\\' && str[prefix - 1] != '/')
|
||||||
|
++prefix;
|
||||||
|
|
||||||
|
for (const auto& i : std::filesystem::recursive_directory_iterator(mPath))
|
||||||
|
{
|
||||||
|
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.";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileSystemArchive::listResources(FileMap& out)
|
void FileSystemArchive::listResources(FileMap& out)
|
||||||
{
|
{
|
||||||
if (!mBuiltIndex)
|
for (auto& [k, v] : mIndex)
|
||||||
{
|
out[k] = &v;
|
||||||
const auto str = mPath.u8string();
|
|
||||||
size_t prefix = str.size();
|
|
||||||
|
|
||||||
if (!mPath.empty() && str[prefix - 1] != '\\' && str[prefix - 1] != '/')
|
|
||||||
++prefix;
|
|
||||||
|
|
||||||
for (const auto& i : std::filesystem::recursive_directory_iterator(mPath))
|
|
||||||
{
|
|
||||||
if (std::filesystem::is_directory(i))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const auto& path = i.path();
|
|
||||||
const std::string proper = Files::pathToUnicodeString(path);
|
|
||||||
|
|
||||||
FileSystemArchiveFile file(path);
|
|
||||||
|
|
||||||
VFS::Path::Normalized searchable(std::string_view{ proper }.substr(prefix));
|
|
||||||
|
|
||||||
const auto inserted = mIndex.emplace(std::move(searchable), std::move(file));
|
|
||||||
if (!inserted.second)
|
|
||||||
Log(Debug::Warning)
|
|
||||||
<< "Warning: found duplicate file for '" << proper
|
|
||||||
<< "', please check your file system for two files with the same name in different cases.";
|
|
||||||
else
|
|
||||||
out[inserted.first->first] = &inserted.first->second;
|
|
||||||
}
|
|
||||||
mBuiltIndex = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (auto& [k, v] : mIndex)
|
|
||||||
out[k] = &v;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileSystemArchive::contains(Path::NormalizedView file) const
|
bool FileSystemArchive::contains(Path::NormalizedView file) const
|
||||||
|
|
|
@ -36,7 +36,6 @@ namespace VFS
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map<VFS::Path::Normalized, FileSystemArchiveFile, std::less<>> mIndex;
|
std::map<VFS::Path::Normalized, FileSystemArchiveFile, std::less<>> mIndex;
|
||||||
bool mBuiltIndex;
|
|
||||||
std::filesystem::path mPath;
|
std::filesystem::path mPath;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue