mirror of
https://github.com/SabreTools/MPF.git
synced 2026-07-02 17:24:48 +00:00
Move Zstd compression helper to base processor
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
### WIP (xxxx-xx-xx)
|
||||
|
||||
- Add BCA to list of files to select in Check UI
|
||||
- Move Zstd compression helper to base processor
|
||||
|
||||
### 3.5.0 (2025-10-10)
|
||||
|
||||
|
||||
@@ -9,7 +9,9 @@ using SabreTools.RedumpLib.Data;
|
||||
using SharpCompress.Archives;
|
||||
using SharpCompress.Archives.Zip;
|
||||
using SharpCompress.Common;
|
||||
using SharpCompress.Compressors;
|
||||
using SharpCompress.Compressors.Deflate;
|
||||
using SharpCompress.Compressors.ZStandard;
|
||||
using SharpCompress.Writers.Zip;
|
||||
#endif
|
||||
|
||||
@@ -563,6 +565,57 @@ namespace MPF.Processors
|
||||
|
||||
#region Shared Methods
|
||||
|
||||
/// <summary>
|
||||
/// Attempt to compress a file to Zstandard, removing the original on success
|
||||
/// </summary>
|
||||
/// <param name="file">Full path to an existing file</param>
|
||||
/// <returns>True if the compression was a success, false otherwise</returns>
|
||||
internal static bool CompressZstandard(string file)
|
||||
{
|
||||
#if NET20 || NET35 || NET40 || NET452
|
||||
// Compression is not available for this framework version
|
||||
return false;
|
||||
#else
|
||||
// Ensure the file exists
|
||||
if (!File.Exists(file))
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
// Prepare the input and output streams
|
||||
using var ifs = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||||
using var ofs = File.Open($"{file}.zst", FileMode.Create, FileAccess.Write, FileShare.None);
|
||||
using var zst = new ZStandardStream(ofs, CompressionMode.Compress, compressionLevel: 19, leaveOpen: true);
|
||||
|
||||
// Compress and write in blocks
|
||||
int read = 0;
|
||||
do
|
||||
{
|
||||
byte[] buffer = new byte[3 * 1024 * 1024];
|
||||
|
||||
read = ifs.Read(buffer, 0, buffer.Length);
|
||||
if (read == 0)
|
||||
break;
|
||||
|
||||
zst.Write(buffer, 0, read);
|
||||
zst.Flush();
|
||||
} while (read > 0);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Try to delete the incomplete
|
||||
try { File.Delete($"{file}.zst"); } catch { }
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Try to delete the file
|
||||
try { File.Delete(file); } catch { }
|
||||
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generate a CMP XML datfile string based on a single input file
|
||||
/// </summary>
|
||||
|
||||
@@ -8,8 +8,6 @@ using SabreTools.RedumpLib;
|
||||
using SabreTools.RedumpLib.Data;
|
||||
#if NET462_OR_GREATER || NETCOREAPP
|
||||
using SharpCompress.Archives.Zip;
|
||||
using SharpCompress.Compressors;
|
||||
using SharpCompress.Compressors.ZStandard;
|
||||
#endif
|
||||
|
||||
namespace MPF.Processors
|
||||
@@ -661,57 +659,6 @@ namespace MPF.Processors
|
||||
|
||||
#region Private Extra Methods
|
||||
|
||||
/// <summary>
|
||||
/// Attempt to compress a file to Zstandard, removing the original on success
|
||||
/// </summary>
|
||||
/// <param name="file">Full path to an existing file</param>
|
||||
/// <returns>True if the compression was a success, false otherwise</returns>
|
||||
private static bool CompressZstandard(string file)
|
||||
{
|
||||
#if NET20 || NET35 || NET40 || NET452
|
||||
// Compression is not available for this framework version
|
||||
return false;
|
||||
#else
|
||||
// Ensure the file exists
|
||||
if (!File.Exists(file))
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
// Prepare the input and output streams
|
||||
using var ifs = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||||
using var ofs = File.Open($"{file}.zst", FileMode.Create, FileAccess.Write, FileShare.None);
|
||||
using var zst = new ZStandardStream(ofs, CompressionMode.Compress, compressionLevel: 19, leaveOpen: true);
|
||||
|
||||
// Compress and write in blocks
|
||||
int read = 0;
|
||||
do
|
||||
{
|
||||
byte[] buffer = new byte[3 * 1024 * 1024];
|
||||
|
||||
read = ifs.Read(buffer, 0, buffer.Length);
|
||||
if (read == 0)
|
||||
break;
|
||||
|
||||
zst.Write(buffer, 0, read);
|
||||
zst.Flush();
|
||||
} while (read > 0);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Try to delete the incomplete
|
||||
try { File.Delete($"{file}.zst"); } catch { }
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Try to delete the file
|
||||
try { File.Delete(file); } catch { }
|
||||
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get if the datfile exists in the log
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user