MoltenMercury/libWyvernzora/IO/Packaging/AFS/AFSPackageCreator.cs

(开头部分) 5KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace libWyvernzora.IO.Packaging
{
    public class AFSPackageCreator : IDisposable 
    {
        //Mainly depends on the PackageEntry.GetAdditionalProperty(...) func.

        const int ALIGN = 0x800;
        Queue<PackageEntry> fileEntries = new Queue<PackageEntry>();
        string npath;
        public Action<Double> NotifyProgress { get; set; }
        public Action<String> NotifyDetails { get; set; }
        public Boolean HasErrors { get; set; }

        public AFSPackageCreator(string path)
        { npath = path; }
        public void AddFile(PackageEntry macro)
        {
            if (macro.Name.Length <= 32)
            {
                fileEntries.Enqueue(macro);
            }
            else
            {
                NotifyDetails(String.Format("Error :> Filename overflow :> \"{0}\"", macro.Name));
                HasErrors = true;
            }
        }
        public void Flush()
        {
            if (NotifyProgress != null) NotifyProgress(0);
            if (NotifyDetails != null) NotifyDetails("Building Header...");
            string cpath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "temp");
            if (!System.IO.Directory.Exists(cpath)) System.IO.Directory.CreateDirectory(cpath);

            //Calculate Header Length

            //4 bytes Magic Number + 4 bytes F_Count
            //4 bytes Descriptor Offset + 4 Bytes Descriptor Length
            //                                                      = 16 Bytes
            Int32 hdrlen = 16 + fileEntries.Count * 8;
            Int32 descLen = fileEntries.Count * 0x30;
            hdrlen = calcCapacity(hdrlen);
            descLen = calcCapacity(descLen);
            if (NotifyDetails != null) NotifyDetails("Done!\n");
            if (NotifyDetails != null) NotifyDetails("Writing Header...");
            using (ExStream fs = new ExStream(npath, FileMode.Create, FileAccess.ReadWrite))
            {
                //Write Identifier
                StreamTools.WriteASCII(fs, "AFS\0");
                StreamTools.WriteI32(fs, fileEntries.Count, BitSequence.LittleEndian);

                //update Header
                Int32 c_offset = hdrlen;
                Int32 fp = 0;

后面还有 81 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 算力/个。 规则说明

AI 解读 AI

登录后可用,每次 10 算力,解读结果公开显示在下面。

还没有人解读过这个文件。