Files
XCEngine/engine/include/XCEngine/Core/IO/ResourceFileSystem.h
ssdfasd d575532966 docs: update TEST_SPEC.md and README.md to reflect new directory structure
- TEST_SPEC.md: Updated test directory structure to reflect Core/Asset,
  Core/IO, and Resources/<Type> subdirectories
- TEST_SPEC.md: Updated module names and test counts (852 total)
- TEST_SPEC.md: Updated build commands for new Resources subdirectories
- README.md: Updated engine structure with Core/Asset/ and Core/IO/
- README.md: Updated Resources section with layered architecture
- README.md: Updated test coverage table with accurate counts
2026-03-24 16:14:05 +08:00

76 lines
2.6 KiB
C++

#pragma once
#include <XCEngine/Core/Asset/ResourceTypes.h>
#include <XCEngine/Core/Containers/String.h>
#include <XCEngine/Core/Containers/Array.h>
#include <XCEngine/Core/Containers/HashMap.h>
#include <XCEngine/Core/SmartPtr.h>
#include <XCEngine/Threading/Mutex.h>
namespace XCEngine {
namespace Resources {
class IArchive {
public:
virtual ~IArchive() = default;
virtual bool Open(const Containers::String& path) = 0;
virtual void Close() = 0;
virtual bool Read(const Containers::String& fileName, void* buffer, size_t size, size_t offset) const = 0;
virtual size_t GetSize(const Containers::String& fileName) const = 0;
virtual bool Exists(const Containers::String& fileName) const = 0;
virtual void Enumerate(const Containers::String& pattern, Containers::Array<Containers::String>& outFiles) const = 0;
virtual bool IsValid() const = 0;
};
struct ResourceInfo {
Containers::String path;
size_t size = 0;
Core::uint64 modifiedTime = 0;
bool inArchive = false;
Containers::String archivePath;
};
class ResourceFileSystem {
public:
ResourceFileSystem();
~ResourceFileSystem();
void Initialize(const Containers::String& rootPath);
void Shutdown();
bool AddArchive(const Containers::String& archivePath);
bool AddDirectory(const Containers::String& directoryPath);
void RemoveArchive(const Containers::String& archivePath);
bool FindResource(const Containers::String& relativePath, Containers::String& outAbsolutePath) const;
Containers::Array<Core::uint8> ReadResource(const Containers::String& relativePath) const;
bool Exists(const Containers::String& relativePath) const;
bool GetResourceInfo(const Containers::String& relativePath, ResourceInfo& outInfo) const;
void EnumerateResources(const Containers::String& pattern, Containers::Array<ResourceInfo>& outResources) const;
static ResourceFileSystem& Get();
private:
IArchive* FindArchive(const Containers::String& relativePath) const;
bool FindInDirectories(const Containers::String& relativePath, Containers::String& outAbsolutePath) const;
bool FindInArchives(const Containers::String& relativePath, Containers::String& outArchivePath) const;
Containers::String m_rootPath;
Containers::Array<Core::UniqueRef<IArchive>> m_archives;
Containers::Array<Containers::String> m_directories;
mutable Containers::HashMap<Containers::String, ResourceInfo> m_infoCache;
mutable Threading::Mutex m_mutex;
};
} // namespace Resources
} // namespace XCEngine