public void Save(FpmfArchive archive, string directoryPath) { DirectoryInfo directory = new DirectoryInfo(directoryPath); if (!directory.Exists) { throw new FileNotFoundException($"Directory: {directoryPath} not found."); } string relativeArchiveDir = archive.DatPath .Replace("/%08x.dat", "") .Replace("./", "") .Replace('/', Path.DirectorySeparatorChar); string rootPath = Path.Combine(directory.FullName, relativeArchiveDir); List <FpmfArchiveFile> files = archive.GetFiles(); foreach (FpmfArchiveFile file in files) { string relativeFilePath = file.FilePath .Replace(".\\", "") .Replace('\\', Path.DirectorySeparatorChar); string filePath = Path.Combine(rootPath, relativeFilePath); FileInfo fileInfo = new FileInfo(filePath); if (!Directory.Exists(fileInfo.DirectoryName)) { Directory.CreateDirectory(fileInfo.DirectoryName); } File.WriteAllBytes(filePath, file.Data); } }
private void SavePack(FpmfArchive archive, string inPath, string outPath, string archiveName) { Directory.CreateDirectory(outPath); IBuffer fileBuff = new StreamBuffer(); IBuffer headerBuff = new StreamBuffer(); List <FpmfArchiveFile> archiveFiles = archive.GetFiles(); foreach (FpmfArchiveFile archiveFile in archiveFiles) { fileBuff.WriteByte((byte)archiveFile.directoryPathSize); fileBuff.WriteCString(archiveFile.directoryPath); fileBuff.Position = fileBuff.Position - 1; fileBuff.WriteByte((byte)archiveFile.filePathSize); fileBuff.WriteCString(archiveFile.filePath); fileBuff.Position = fileBuff.Position - 1; fileBuff.WriteUInt32(archiveFile.datNumber); fileBuff.WriteUInt32(archiveFile.offset); fileBuff.WriteUInt32(archiveFile.size); fileBuff.WriteUInt32(archiveFile.unknown0); fileBuff.WriteUInt32(archiveFile.unknown1); } headerBuff.WriteBytes(_MagicBytes); headerBuff.WriteInt32(0); headerBuff.WriteUInt32(archive.unknown0); headerBuff.WriteUInt32(archive.unknown1); headerBuff.WriteUInt32(archive.unknown2); headerBuff.WriteByte(archive.unknown3); headerBuff.WriteByte(archive.unknown4); headerBuff.WriteUInt32(archive.unknown5); headerBuff.WriteInt32(archive.datPath.Length + 9); headerBuff.WriteByte((byte)archive.datPath.Length); headerBuff.WriteCString(archive.datPath); headerBuff.Position = headerBuff.Position - 1; uint type = 0; switch (archiveName) { case "script": case "settings": case "item": case "interface": type = 1; break; case "help_end": type = 2; break; } headerBuff.WriteUInt32(type); headerBuff.WriteUInt32(archive.unknown8); headerBuff.WriteUInt32(archive.unknown9); headerBuff.WriteUInt32(archive.unknown10); headerBuff.WriteInt32(archive.key.Length); headerBuff.WriteBytes(archive.key); headerBuff.WriteUInt32(archive.unknown11); headerBuff.WriteInt32(fileBuff.Size + 4); headerBuff.WriteUInt32(archive.numFiles); headerBuff.WriteBytes(fileBuff.GetAllBytes()); headerBuff = EncryptHed(headerBuff); string hedPath = outPath.Substring(0, outPath.LastIndexOf("\\")) + ".hed"; BinaryWriter headerWriter = new BinaryWriter(File.Open(hedPath, FileMode.Create)); headerBuff.Position = 4; headerBuff.WriteInt32(headerBuff.Size - 12); headerWriter.Write(headerBuff.GetAllBytes(), 0, headerBuff.Size); headerWriter.Flush(); headerWriter.Close(); BinaryWriter datWriter = new BinaryWriter(File.Open(outPath + "\\" + "00000000.dat", FileMode.Create)); IBuffer outBuff = new StreamBuffer(); foreach (FpmfArchiveFile archiveFile in archiveFiles) { string inputFile = inPath + "\\" + archiveName + archiveFile.filePath.Substring(1); IBuffer datFileReader = new StreamBuffer(inputFile); datFileReader = EncryptDat(datFileReader, archive.key); outBuff.WriteBytes(datFileReader.GetAllBytes()); } datWriter.Write(outBuff.GetAllBytes(), 0, outBuff.Size); datWriter.Flush(); datWriter.Close(); }