internal static void CalcDirSize(RomfsMetaData metaData, DirectoryInfo dir) { if (metaData.MDirTableLen == 0) { metaData.MDirTableLen = 0x18; } else { metaData.MDirTableLen += 0x18 + (uint)RomFS.Align((ulong)dir.Name.Length * 2, 4); } FileInfo[] files = dir.GetFiles(); foreach (FileInfo t in files) { metaData.MFileTableLen += 0x20 + (uint)RomFS.Align((ulong)t.Name.Length * 2, 4); } DirectoryInfo[] subDirectories = dir.GetDirectories(); foreach (DirectoryInfo t in subDirectories) { RomFS.CalcDirSize(metaData, t); } metaData.FileNum += (uint)files.Length; metaData.DirNum += (uint)subDirectories.Length; }
internal static void CalcRomfsSize(RomfsMetaData metaData) { metaData.DirNum = 1; DirectoryInfo rootDi = new DirectoryInfo(RootDir); RomFS.CalcDirSize(metaData, rootDi); metaData.MDirHashTableEntry = RomFS.GetHashTableEntryCount(metaData.DirNum); metaData.MFileHashTableEntry = RomFS.GetHashTableEntryCount(metaData.FileNum); uint metaDataSize = (uint)RomFS.Align(0x28 + metaData.MDirHashTableEntry * 4 + metaData.MDirTableLen + metaData.MFileHashTableEntry * 4 + metaData.MFileTableLen, PaddingAlign); for (int i = 0; i < metaData.MDirHashTableEntry; i++) { metaData.DirHashTable.Add(RomfsUnusedEntry); } for (int i = 0; i < metaData.MFileHashTableEntry; i++) { metaData.FileHashTable.Add(RomfsUnusedEntry); } uint pos = metaData.InfoHeader.HeaderLength; for (int i = 0; i < 4; i++) { metaData.InfoHeader.Sections[i].Offset = pos; uint size = 0; switch (i) { case 0: size = metaData.MDirHashTableEntry * 4; break; case 1: size = metaData.MDirTableLen; break; case 2: size = metaData.MFileHashTableEntry * 4; break; case 3: size = metaData.MFileTableLen; break; } metaData.InfoHeader.Sections[i].Size = size; pos += size; } metaData.InfoHeader.DataOffset = metaDataSize; }