From f0daba69bef0bdeb9319192cfc0d1c7eb2e3f2a1 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Sat, 31 May 2025 07:48:10 +1000 Subject: [PATCH] Call `FileStream.Flush` for SaveRAM and movies (resolves #3419) ...and anything else which uses `FrameworkZipWriter`/`ZipStateSaver`, which I think is just savestates --- src/BizHawk.Client.Common/FrameworkZipWriter.cs | 11 ++++++++--- src/BizHawk.Client.EmuHawk/MainForm.cs | 6 ++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/BizHawk.Client.Common/FrameworkZipWriter.cs b/src/BizHawk.Client.Common/FrameworkZipWriter.cs index a90755dd84..e57bcfef63 100644 --- a/src/BizHawk.Client.Common/FrameworkZipWriter.cs +++ b/src/BizHawk.Client.Common/FrameworkZipWriter.cs @@ -8,14 +8,17 @@ namespace BizHawk.Client.Common public class FrameworkZipWriter : IZipWriter { private ZipArchive _archive; + + private FileStream _fs; + private Zstd _zstd; private readonly CompressionLevel _level; private readonly int _zstdCompressionLevel; public FrameworkZipWriter(string path, int compressionLevel) { - _archive = new ZipArchive(new FileStream(path, FileMode.Create, FileAccess.Write), - ZipArchiveMode.Create, false); + _fs = new(path, FileMode.Create, FileAccess.Write); + _archive = new(_fs, ZipArchiveMode.Create, leaveOpen: true); if (compressionLevel == 0) _level = CompressionLevel.NoCompression; else if (compressionLevel < 5) @@ -53,7 +56,9 @@ namespace BizHawk.Client.Common _archive.Dispose(); _archive = null; } - + _fs?.Flush(flushToDisk: true); + _fs?.Dispose(); + _fs = null; if (_zstd != null) { _zstd.Dispose(); diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs index 033d430751..f5ba097996 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.cs @@ -2096,8 +2096,10 @@ namespace BizHawk.Client.EmuHawk if (saveram == null) return true; - using (var writer = new BinaryWriter(new FileStream(newPath, FileMode.Create, FileAccess.Write))) - writer.Write(saveram, 0, saveram.Length); + FileStream fs = new(newPath, FileMode.Create, FileAccess.Write); + using (BinaryWriter writer = new(fs)) writer.Write(saveram); + fs.Flush(flushToDisk: true); + fs.Dispose(); if (file.Exists) {