void CInArchive::ReadDir(CDir &d, int level) { if (!d.IsDir()) return; SeekToBlock(d.ExtentLocation); UInt64 startPos = _position; bool firstItem = true; for (;;) { UInt64 offset = _position - startPos; if (offset >= d.DataLength) break; Byte len = ReadByte(); if (len == 0) continue; CDir subItem; ReadDirRecord2(subItem, len); if (firstItem && level == 0) IsSusp = subItem.CheckSusp(SuspSkipSize); if (!subItem.IsSystemItem()) d._subItems.Add(subItem); firstItem = false; } for (int i = 0; i < d._subItems.Size(); i++) ReadDir(d._subItems[i], level + 1); }
void CInArchive::CreateRefs(CDir &d) { if (!d.IsDir()) return; for (int i = 0; i < d._subItems.Size(); i++) { CRef ref; CDir &subItem = d._subItems[i]; subItem.Parent = &d; ref.Dir = &d; ref.Index = i; Refs.Add(ref); CreateRefs(subItem); } }