示例#1
0
        public Stream ContentFile(PadStream padStream, long position, long bytesCount)
        {
            padStream.keys     = new byte[] { 63 };
            padStream.Position = position;
            byte[] buffer = new byte[bytesCount];
            for (long i = 0; i < bytesCount; i++)
            {
                buffer[i] = (byte)padStream.ReadByte();
            }
            MemoryStream memoryStream = new MemoryStream(buffer, false);

            padStream.keys = this.keys;
            return(memoryStream);
        }
示例#2
0
        public UnPak(string pakFile)
        {
            if (!File.Exists(pakFile))
            {
                throw new FileNotFoundException("文件不存在!");
            }
            string       pakDirectory = Path.GetDirectoryName(pakFile) + "/" + Path.GetFileNameWithoutExtension(pakFile);
            Stream       stream       = new FileStream(pakFile, FileMode.Open);
            PadStream    padStream    = new PadStream(stream, this.keys);
            BinaryReader binaryReader = new BinaryReader(padStream, Encoding.UTF8, true);

            byte[] array = new byte[4];
            if (stream.Read(array, 0, array.Length) != array.Length || array[0] != (byte)'P' || array[1] != (byte)'K' || array[2] != (byte)'2' || array[3] != (byte)'\0')
            {
                throw new FileLoadException("该文件不是Survivalcraft2(2.2)的PAK文件!");
            }
            long           num            = binaryReader.ReadInt64();
            int            num2           = binaryReader.ReadInt32();
            List <PakInfo> listFileStream = new List <PakInfo>(num2);

            for (int i = 0; i < num2; i++)
            {
                string fileName = binaryReader.ReadString();
                string typeName = binaryReader.ReadString();
                long   num3     = binaryReader.ReadInt64() + num;
                long   num4     = binaryReader.ReadInt64();
                //Console.WriteLine($"{i}: {typeName},{fileName},{num3},{num4}");
                long position = binaryReader.BaseStream.Position;
                listFileStream.Add(new PakInfo
                {
                    fileStream = ContentFile(padStream, num3, num4),
                    fileName   = fileName,
                    typeName   = typeName
                });
                binaryReader.BaseStream.Position = position;
            }
            Load(listFileStream, pakDirectory);
            binaryReader.Dispose();
            padStream.Dispose();
        }
示例#3
0
        public Pak(string PakDirectory)
        {
            if (!Directory.Exists(PakDirectory))
            {
                throw new DirectoryNotFoundException("将要封包的文件夹不存在");
            }
            List <ContentFileInfo> list = new List <ContentFileInfo>();

            list = ContentFiles(list, PakDirectory);
            List <long> list2 = new List <long>();

            new DirectoryInfo(PakDirectory);
            if (PakDirectory.EndsWith("/") || PakDirectory.EndsWith("\\"))
            {
                PakDirectory = PakDirectory.Substring(0, PakDirectory.Length - 1);
            }
            FileStream fileStream;

            if (File.Exists(PakDirectory + ".pak"))
            {
                if (File.Exists(PakDirectory + ".pak.bak"))
                {
                    File.Delete(PakDirectory + ".pak.bak");
                }
                File.Move(PakDirectory + ".pak", PakDirectory + ".pak.bak");
            }
            fileStream = new FileStream(PakDirectory + ".pak", FileMode.Create);
            PadStream    myStream     = new PadStream(fileStream, this.keys);
            BinaryWriter binaryWriter = new BinaryWriter(myStream, Encoding.UTF8, true);

            fileStream.WriteByte((byte)'P');
            fileStream.WriteByte((byte)'K');
            fileStream.WriteByte((byte)'2');
            fileStream.WriteByte((byte)'\0');
            binaryWriter.Write((long)0);
            binaryWriter.Write(list.Count);
            foreach (ContentFileInfo current in list)
            {
                binaryWriter.Write(current.fileName.Substring(PakDirectory.Length + 1, current.fileName.Length - PakDirectory.Length - 1));
                binaryWriter.Write(current.typeName);
                list2.Add(binaryWriter.BaseStream.Position);
                binaryWriter.Write((long)0);
                binaryWriter.Write((long)0);
            }
            long position = binaryWriter.BaseStream.Position;

            binaryWriter.BaseStream.Position = 4L;
            binaryWriter.Write(position);
            long num  = position;
            int  num2 = 0;
            long num3;

            foreach (ContentFileInfo info in list)
            {
                binaryWriter.BaseStream.Position = num;
                binaryWriter.Write((byte)222);
                binaryWriter.Write((byte)173);
                binaryWriter.Write((byte)190);
                binaryWriter.Write((byte)239);
                num3 = binaryWriter.BaseStream.Position;
                PadStream myStream2 = new PadStream(Load(info.fileName, info.typeName), new byte[] { 63 });
                byte[]    buffer    = new byte[myStream2.Length];
                myStream2.Read(buffer, 0, buffer.Length);
                for (int i = 0; i < buffer.Length; i++)
                {
                    fileStream.WriteByte(buffer[i]);
                }
                num = binaryWriter.BaseStream.Position;
                binaryWriter.BaseStream.Position = list2[num2++];
                binaryWriter.Write(num3 - position);
                binaryWriter.Write(myStream2.Length);
            }
            binaryWriter.Dispose();
            fileStream.Dispose();
        }