XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension

【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等

公开
关注 0 Fork 0 Star 0
UTF-8
using XFEExtension.NetCore.BufferExtension;

namespace XFEExtension.NetCore.FileExtension.XFEPackage;

/// <summary>
/// XFE文件打包协议
/// </summary>
public static class XFEPackage
{
    /// <summary>
    /// 打包文件
    /// </summary>
    /// <param name="packageFilePath">待打包的文件夹路径</param>
    /// <param name="fileName">打包后的文件路径</param>
    public static void PackFile(string packageFilePath, string fileName) => File.WriteAllBytes(fileName, PackFile(packageFilePath));

    /// <summary>
    /// 打包文件
    /// </summary>
    /// <param name="packageFilePath">待打包的文件夹路径</param>
    /// <returns>打包后的文件</returns>
    public static byte[] PackFile(string packageFilePath)
    {
        var buffer = new XFEBuffer();
        var packagedDirectory = GetFilePackage(packageFilePath);
        buffer.Add(Path.GetFileName(packageFilePath), packagedDirectory.Package());
        return buffer.ToBuffer();
    }

    /// <summary>
    /// 解包文件
    /// </summary>
    /// <param name="packageFilePath">待解包文件路径</param>
    /// <param name="outputDirectory">输出文件夹</param>
    public static void UnPackFile(string packageFilePath, string outputDirectory) => UnPackFile(packageFilePath).UnPackage(outputDirectory);

    /// <summary>
    /// 解包文件
    /// </summary>
    /// <param name="packageFilePath">待解包文件路径</param>
    /// <returns>解包后的文件</returns>
    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;
    }
}