private static void WriteToFile(string destinationArchiveFileName, SortedDictionary <string, FileEntry> entries) { var tree = new DirectoryTree(); //Provisory Tree foreach (var fileName in entries.Keys) { tree.AddEntry(fileName); } int directorySize = tree.CalculateSize() + 20; using (var fileStream = File.Create(destinationArchiveFileName)) { BinaryWriter chunckWriter = new BinaryWriter(fileStream); chunckWriter.BaseStream.Position = directorySize; foreach (var file in entries) { if (chunckWriter.BaseStream.Position > Int32.MaxValue) { throw new Exception("Maximum allowed size is 2GB (2 147 483 647 bytes)."); } file.Value.OffsetOfCompressedData = (int)chunckWriter.BaseStream.Position; if (file.Value.FlagCompression != CompressionMethod.None) { foreach (var size in file.Value.compressedChunkSizes) { chunckWriter.Write(size); } } foreach (var chunk in file.Value.ChunkBytes) { chunckWriter.Write(chunk); } } chunckWriter.Write("Copyright " + DateTime.Now.Year.ToString() + " Cavedog Entertainment"); //Endfile mandatory string BinaryWriter headerWriter = new BinaryWriter(new MemoryStream()); headerWriter.BaseStream.Position = 0; headerWriter.Write(HpiArchive.HeaderMarker); headerWriter.Write(HpiArchive.DefaultVersion); tree = new DirectoryTree(); //Definitive Tree foreach (var item in entries.Keys) { tree.AddEntry(item); } directorySize = tree.CalculateSize() + 20; //TO IMPROVE, BAD CODE headerWriter.Write(directorySize); headerWriter.Write(HpiArchive.NoObfuscationKey); int directoryStart = 20; headerWriter.Write(directoryStart); //Directory Start at Pos20 IEnumerator <FileEntry> sequence = entries.Values.ToList().GetEnumerator(); HpiArchive.SetEntries(tree, headerWriter, sequence); fileStream.Position = 0; headerWriter.BaseStream.Position = 0; headerWriter.BaseStream.CopyTo(fileStream); if (fileStream.Length > Int32.MaxValue) { MessageBox.Show("The HPI file was created, but its size exceeds 2GB (2 147 483 647 bytes). A fatal error may occur when loading the game.", "Oversize Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } }