1
0
mirror of synced 2024-11-27 21:10:48 +01:00
TaikoSoundEditor/GZ.cs
2023-07-19 08:10:25 +03:00

91 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static TaikoSoundEditor.TJA;
namespace TaikoSoundEditor
{
internal class GZ
{
public static string DecompressString(string gzPath)
{
Logger.Info("GZ Decompressing string");
using FileStream originalFileStream = File.OpenRead(gzPath);
using GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress);
using StreamReader reader = new StreamReader(decompressionStream);
return reader.ReadToEnd();
}
public static byte[] DecompressBytes(string gzPath)
{
Logger.Info("GZ Decompressing bytes");
using FileStream originalFileStream = File.OpenRead(gzPath);
using GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress);
using MemoryStream ms = new MemoryStream();
decompressionStream.CopyTo(ms);
return ms.ToArray();
}
public static byte[] CompressToBytes(string content)
{
Logger.Info("GZ Compressing bytes");
using var stream = new MemoryStream();
using var writer = new StreamWriter(stream);
writer.Write(content);
using var ostream = new MemoryStream();
using (var compressionStream = new GZipStream(ostream, CompressionMode.Compress))
{
stream.CopyTo(compressionStream);
}
return ostream.ToArray();
}
public static string CompressToFile(string fileName, string content)
{
Logger.Info("GZ Compressing file");
var tmp = "~ztmp";
if (!Directory.Exists(tmp))
Directory.CreateDirectory(tmp);
var fn = Path.GetFileNameWithoutExtension(fileName);
fn = Path.Combine(tmp, fn);
File.WriteAllText(fn, content);
fileName = Path.GetFullPath(fileName);
var p = new Process();
p.StartInfo.FileName = Path.GetFullPath(@"Tools\7z\7za.exe");
p.StartInfo.ArgumentList.Add("a");
p.StartInfo.ArgumentList.Add("-tgzip");
p.StartInfo.ArgumentList.Add(fileName);
p.StartInfo.ArgumentList.Add(Path.GetFullPath(fn));
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
foreach (var a in p.StartInfo.ArgumentList)
Debug.WriteLine(a);
p.Start();
p.WaitForExit();
int exitCode = p.ExitCode;
string stderr = p.StandardError.ReadToEnd();
string stdout = p.StandardError.ReadToEnd();
if (exitCode != 0)
throw new Exception($"Process 7za failed with exit code {exitCode}:\n" + stderr);
return stdout;
}
}
}