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); }
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(); }
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(); }