Ejemplo n.º 1
0
        private void DoOutputPrep(VirtualFilesystemNode vfsNode, List <FSTEntry> outputFST, List <byte> fstNameBank, EndianBinaryWriter writer, int curParentDirIndex)
        {
            FSTEntry fstEnt = new FSTEntry();

            if (vfsNode.Type == NodeType.Directory)
            {
                VirtualFilesystemDirectory dir = (VirtualFilesystemDirectory)vfsNode;

                fstEnt.Type           = FSTNodeType.Directory;
                fstEnt.FileNameOffset = fstNameBank.Count();

                fstNameBank.AddRange(Encoding.ASCII.GetBytes(dir.Name.ToCharArray()));
                fstNameBank.Add(0);

                fstEnt.FileOffsetParentDir = curParentDirIndex;
                curParentDirIndex          = outputFST.Count();

                int thisDirIndex = curParentDirIndex;

                outputFST.Add(fstEnt); //Placeholder for this dir

                foreach (VirtualFilesystemNode child in dir.Children)
                {
                    DoOutputPrep(child, outputFST, fstNameBank, writer, curParentDirIndex);
                }

                int dirEndIndex = outputFST.Count();
                fstEnt.FileSizeNextDirIndex = (dirEndIndex - thisDirIndex) + thisDirIndex;
                outputFST[thisDirIndex]     = fstEnt; //Add the actual entry after giving it the rest of the info
            }
            else
            {
                VirtualFilesystemFile file = (VirtualFilesystemFile)vfsNode;

                fstEnt.Type = FSTNodeType.File;
                fstEnt.FileSizeNextDirIndex = file.Data.Length;
                fstEnt.FileNameOffset       = fstNameBank.Count();

                fstNameBank.AddRange(Encoding.ASCII.GetBytes(file.Name.ToCharArray()));
                fstNameBank.AddRange(Encoding.ASCII.GetBytes(file.Extension.ToCharArray()));
                fstNameBank.Add((byte)0);

                writer.BaseStream.Position = (int)writer.BaseStream.Position + (32 - ((int)writer.BaseStream.Position % 32)) % 32;

                fstEnt.FileOffsetParentDir = (int)writer.BaseStream.Position;

                writer.Write(file.Data);

                for (int i = 0; i < ((32 - (file.Data.Length - 32)) % 32); i++)
                {
                    writer.Write((byte)0);
                }

                //Console.WriteLine("Wrote file: " + file.Name);

                outputFST.Add(fstEnt);
            }
        }
Ejemplo n.º 2
0
        private void DumpDirsRecursive(VirtualFilesystemNode vfsObj, string root)
        {
            if (vfsObj.Type == NodeType.Directory)
            {
                VirtualFilesystemDirectory dir = (VirtualFilesystemDirectory)vfsObj;

                string testRoot = root + @"\" + dir.Name;

                Directory.CreateDirectory(testRoot);

                foreach (VirtualFilesystemNode child in dir.Children)
                {
                    if (child.Type == NodeType.Directory)
                    {
                        Directory.CreateDirectory(testRoot + @"\" + child.Name);

                        Console.WriteLine("Wrote directory: " + testRoot + @"\" + child.Name);

                        DumpDirsRecursive(child, testRoot);
                    }

                    else
                    {
                        DumpDirsRecursive(child, testRoot);
                    }
                }
            }

            else
            {
                VirtualFilesystemFile file = (VirtualFilesystemFile)vfsObj;

                using (FileStream stream = new FileStream(root + @"\" + file.Name + file.Extension, FileMode.Create))
                {
                    EndianBinaryWriter writer = new EndianBinaryWriter(stream, Endian.Big);

                    writer.Write(file.Data);

                    Console.WriteLine("Wrote file: " + root + @"\" + file.Name + file.Extension);
                }
            }
        }
Ejemplo n.º 3
0
        private int GetFSTSkipValue(int curValue, VirtualFilesystemNode node)
        {
            if (node.Type == NodeType.Directory)
            {
                VirtualFilesystemDirectory dir = (VirtualFilesystemDirectory)node;
                curValue += (12 + dir.Name.Length + 1);

                foreach (VirtualFilesystemNode child in dir.Children)
                {
                    curValue = GetFSTSkipValue(curValue, child);
                }
            }
            else
            {
                VirtualFilesystemFile file = (VirtualFilesystemFile)node;
                curValue += (int)(12 + file.Name.Length + file.Extension.Length + 1);
            }

            return(curValue);
        }