private Result ReadImpl(out long entriesRead, ref FindPosition position, Span <DirectoryEntry> entryBuffer) { HierarchicalRomFileTable <RomFileInfo> tab = ParentFileSystem.FileTable; int i = 0; if (Mode.HasFlag(OpenDirectoryMode.Directory)) { while ((entryBuffer.IsEmpty || i < entryBuffer.Length) && tab.FindNextDirectory(ref position, out string name)) { if (!entryBuffer.IsEmpty) { ref DirectoryEntry entry = ref entryBuffer[i]; Span <byte> nameUtf8 = Encoding.UTF8.GetBytes(name); StringUtils.Copy(entry.Name, nameUtf8); entry.Name[PathTools.MaxPathLength] = 0; entry.Type = DirectoryEntryType.Directory; entry.Size = 0; } i++; } }
public RomFsFileSystem(IStorage storage) { BaseStorage = storage; Header = new RomfsHeader(storage.AsFile(OpenMode.Read)); IStorage dirHashTable = storage.Slice(Header.DirHashTableOffset, Header.DirHashTableSize); IStorage dirEntryTable = storage.Slice(Header.DirMetaTableOffset, Header.DirMetaTableSize); IStorage fileHashTable = storage.Slice(Header.FileHashTableOffset, Header.FileHashTableSize); IStorage fileEntryTable = storage.Slice(Header.FileMetaTableOffset, Header.FileMetaTableSize); FileTable = new HierarchicalRomFileTable <RomFileInfo>(dirHashTable, dirEntryTable, fileHashTable, fileEntryTable); }