Ensure save file is closed after saving.

If you attempt to load after saving, this prevents an exception from the file being "in use" due to the unclosed file handle.
This commit is contained in:
RoosterDragon
2023-07-18 18:04:24 +01:00
committed by abcdefg30
parent 9caf12d133
commit 813d48dd70

View File

@@ -284,39 +284,40 @@ namespace OpenRA.Network
// - File offset of metadata start marker // - File offset of metadata start marker
// - File offset of custom trait data // - File offset of custom trait data
// - Metadata end marker // - Metadata end marker
var file = File.Create(path); using (var file = File.Create(path))
{
ordersStream.Seek(0, SeekOrigin.Begin);
ordersStream.CopyTo(file);
file.Write(BitConverter.GetBytes(MetadataMarker), 0, 4);
file.Write(BitConverter.GetBytes(LastOrdersFrame), 0, 4);
file.Write(BitConverter.GetBytes(LastSyncFrame), 0, 4);
file.Write(lastSyncPacket, 0, Order.SyncHashOrderLength);
ordersStream.Seek(0, SeekOrigin.Begin); var globalSettingsNodes = new List<MiniYamlNode>() { GlobalSettings.Serialize() };
ordersStream.CopyTo(file); file.WriteString(Encoding.UTF8, globalSettingsNodes.WriteToString());
file.Write(BitConverter.GetBytes(MetadataMarker), 0, 4);
file.Write(BitConverter.GetBytes(LastOrdersFrame), 0, 4);
file.Write(BitConverter.GetBytes(LastSyncFrame), 0, 4);
file.Write(lastSyncPacket, 0, Order.SyncHashOrderLength);
var globalSettingsNodes = new List<MiniYamlNode>() { GlobalSettings.Serialize() }; var slotNodes = Slots
file.WriteString(Encoding.UTF8, globalSettingsNodes.WriteToString()); .Select(s => s.Value.Serialize())
.ToList();
file.WriteString(Encoding.UTF8, slotNodes.WriteToString());
var slotNodes = Slots var slotClientNodes = SlotClients
.Select(s => s.Value.Serialize()) .Select(s => s.Value.Serialize(s.Key))
.ToList(); .ToList();
file.WriteString(Encoding.UTF8, slotNodes.WriteToString()); file.WriteString(Encoding.UTF8, slotClientNodes.WriteToString());
var slotClientNodes = SlotClients var traitDataOffset = file.Length;
.Select(s => s.Value.Serialize(s.Key)) file.Write(BitConverter.GetBytes(TraitDataMarker), 0, 4);
.ToList();
file.WriteString(Encoding.UTF8, slotClientNodes.WriteToString());
var traitDataOffset = file.Length; var traitDataNodes = TraitData
file.Write(BitConverter.GetBytes(TraitDataMarker), 0, 4); .Select(kv => new MiniYamlNode(kv.Key.ToString(), kv.Value))
.ToList();
file.WriteString(Encoding.UTF8, traitDataNodes.WriteToString());
var traitDataNodes = TraitData file.Write(BitConverter.GetBytes(ordersStream.Length), 0, 4);
.Select(kv => new MiniYamlNode(kv.Key.ToString(), kv.Value)) file.Write(BitConverter.GetBytes(traitDataOffset), 0, 4);
.ToList(); file.Write(BitConverter.GetBytes(EOFMarker), 0, 4);
file.WriteString(Encoding.UTF8, traitDataNodes.WriteToString()); }
file.Write(BitConverter.GetBytes(ordersStream.Length), 0, 4);
file.Write(BitConverter.GetBytes(traitDataOffset), 0, 4);
file.Write(BitConverter.GetBytes(EOFMarker), 0, 4);
} }
} }
} }