using XFEExtension.NetCore.BufferExtension;
namespace XFEExtension.NetCore.FileExtension.XFEPackage;
///
/// XFE文件打包协议
///
public static class XFEPackage
{
///
/// 打包文件
///
/// 待打包的文件夹路径
/// 打包后的文件路径
public static void PackFile(string packageFilePath, string fileName) => File.WriteAllBytes(fileName, PackFile(packageFilePath));
///
/// 打包文件
///
/// 待打包的文件夹路径
/// 打包后的文件
public static byte[] PackFile(string packageFilePath)
{
var buffer = new XFEBuffer();
var packagedDirectory = GetFilePackage(packageFilePath);
buffer.Add(Path.GetFileName(packageFilePath), packagedDirectory.Package());
return buffer.ToBuffer();
}
///
/// 解包文件
///
/// 待解包文件路径
/// 输出文件夹
public static void UnPackFile(string packageFilePath, string outputDirectory) => UnPackFile(packageFilePath).UnPackage(outputDirectory);
///
/// 解包文件
///
/// 待解包文件路径
/// 解包后的文件
public static XFEPackagedDirectory UnPackFile(string packageFilePath) => GetFilePackage(File.ReadAllBytes(packageFilePath));
internal static XFEPackagedDirectory GetFilePackage(string packageFilePath)
{
if (!Directory.Exists(packageFilePath))
{
throw new DirectoryNotFoundException();
}
var packagedDirectory = new XFEPackagedDirectory
{
Name = Path.GetFileName(packageFilePath)
};
foreach (var file in Directory.GetFiles(packageFilePath))
{
var packagedFile = new XFEPackagedFile
{
Name = Path.GetFileName(file),
Data = File.ReadAllBytes(file)
};
packagedDirectory.PackagedFiles.Add(packagedFile);
}
foreach (var directory in Directory.GetDirectories(packageFilePath))
packagedDirectory.PackagedDirectories.Add(GetFilePackage(directory));
return packagedDirectory;
}
internal static XFEPackagedDirectory GetFilePackage(byte[] filePackageBytes)
{
var buffer = XFEBuffer.ToXFEBuffer(filePackageBytes);
if (buffer.FirstOrDefault() is var keyValuePair)
return GetFilePackageRecursion(keyValuePair.Key, keyValuePair.Value);
return new XFEPackagedDirectory();
}
internal static XFEPackagedDirectory GetFilePackageRecursion(string packageName, byte[] filePackageBytes)
{
var packagedDirectory = new XFEPackagedDirectory
{
Name = packageName
};
var buffer = XFEBuffer.ToXFEBuffer(filePackageBytes);
foreach (var (name, data) in buffer)
{
if (name.StartsWith("D|"))
{
var packagedSubDirectory = GetFilePackageRecursion(name, data);
packagedSubDirectory.Name = name[2..];
packagedDirectory.PackagedDirectories.Add(packagedSubDirectory);
}
else
{
var packagedFile = new XFEPackagedFile
{
Name = name,
Data = data
};
packagedDirectory.PackagedFiles.Add(packagedFile);
}
}
return packagedDirectory;
}
}