* Makes EnsureDirectory properly work for relative and absolute paths * Adds a `PathUtility.GetFullPath` which returns full paths for relative paths to `Core.BaseDirectory`. If the path is absolute, it will return as-is. * Moves EnsureDirectory to `PathUtility`. So `ScriptsHandler.EnsureDirectory` and `AssemblyHandler.EnsureDirectory` are now `PathUtility.EnsureDirectory` * Fixes crash guard so that it copies accounts properly. * Changes world save and auto archive to use a random folder name inside of the temp folder.
93 lines
3 KiB
C#
Executable file
93 lines
3 KiB
C#
Executable file
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
|
|
namespace Server.Compression
|
|
{
|
|
public static class ZstdArchive
|
|
{
|
|
private static readonly string _pathToZstd = new FileInfo(Assembly.GetExecutingAssembly().Location).Directory?.FullName;
|
|
|
|
public static bool ExtractToDirectory(string fileNamePath, string outputDirectory)
|
|
{
|
|
// bsdtar has a bug and hangs, so we are doing it in two steps.
|
|
if (Core.IsWindows)
|
|
{
|
|
var tempTarArchive = Path.Combine(Core.BaseDirectory, "temp/temp-file.tar");
|
|
|
|
try
|
|
{
|
|
var process = new Process
|
|
{
|
|
StartInfo = new ProcessStartInfo
|
|
{
|
|
FileName = _pathToZstd,
|
|
Arguments = $"-q -d \"{fileNamePath}\" -o \"${tempTarArchive}\""
|
|
}
|
|
};
|
|
|
|
process.Start();
|
|
process.WaitForExit();
|
|
|
|
return process.ExitCode == 0 && TarArchive.ExtractToDirectory(tempTarArchive, outputDirectory);
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
finally
|
|
{
|
|
File.Delete(tempTarArchive);
|
|
}
|
|
}
|
|
|
|
return TarArchive.ExtractToDirectory(fileNamePath, outputDirectory, "zstd -q -d", _pathToZstd);
|
|
}
|
|
|
|
public static bool CreateFromPaths(
|
|
IEnumerable<string> paths,
|
|
string destinationArchiveFileName,
|
|
string relativeTo
|
|
)
|
|
{
|
|
// bsdtar has a bug and hangs, so we are doing it in two steps.
|
|
if (Core.IsWindows)
|
|
{
|
|
var tempTarArchive = Path.Combine(Core.BaseDirectory, "temp/temp-file.tar");
|
|
|
|
try
|
|
{
|
|
if (!TarArchive.CreateFromPaths(paths, relativeTo, tempTarArchive))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
var process = new Process
|
|
{
|
|
StartInfo = new ProcessStartInfo
|
|
{
|
|
FileName = Path.Combine(_pathToZstd, "zstd.exe"),
|
|
Arguments = $"-q \"{tempTarArchive}\" -o \"{destinationArchiveFileName}\""
|
|
}
|
|
};
|
|
|
|
process.Start();
|
|
process.WaitForExit();
|
|
|
|
return process.ExitCode == 0;
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
finally
|
|
{
|
|
File.Delete(tempTarArchive);
|
|
}
|
|
}
|
|
|
|
return TarArchive.CreateFromPaths(paths, destinationArchiveFileName, relativeTo, "zstd -q", _pathToZstd);
|
|
}
|
|
}
|
|
}
|