private void SaveFolder(DirectoryNode Root, ushort parent, ref uint block) { foreach (var node in Root) { StfsFile.FileDescriptor desc = new StfsFile.FileDescriptor(); if (node.Name.Length > 0x3F) { throw new FormatException(); } desc.Name = node.Name; desc.Flags = (byte)desc.Name.Length; desc.Flags |= 0x40; // Unknown bit, seems to be set. desc.Parent = parent; Stfs.Files.Add(desc); if (node is DirectoryNode) { desc.Flags |= 0x80; SaveFolder(node as DirectoryNode, (ushort)Stfs.Files.IndexOf(desc), ref block); } else if (node is FileNode) { FileNode file = node as FileNode; desc.Size = (uint)file.Size; desc.Block = block; desc.BlockSize = (uint)(Util.RoundUp(file.Size, StfsFile.BlockSize) / StfsFile.BlockSize); desc.Data = file.Data; block += desc.BlockSize; } } }
public StfsArchive(Stream stream) { Stfs = new StfsFile(stream); Root = new DirectoryNode(); Dictionary <int, DirectoryNode> Directories = new Dictionary <int, DirectoryNode>(); Directories.Add(0xFFFF, Root); for (int i = 0; i < Stfs.Files.Count; i++) { StfsFile.FileDescriptor file = Stfs.Files[i]; DirectoryNode parent = Directories[file.Parent]; if ((file.Flags & 0x80) != 0) { DirectoryNode directory = new DirectoryNode(file.Name); parent.AddChild(directory); Directories.Add(i, directory); } else { parent.AddChild(new FileNode(file.Name, file.Size, new Substream(Stfs.Stream, Stfs.Stream.GetBlockOffset(file.Block), file.Size))); } } }