Esempio n. 1
0
 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;
         }
     }
 }
Esempio n. 2
0
        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)));
                }
            }
        }