TarFile
智能大石头 authored at 2025-04-28 01:05:07
3.02 KiB
X
using NewLife;
using NewLife.Compression;
using NewLife.Log;
using NewLife.Security;
using Xunit;

namespace XUnitTest.Compression;

public class TarEntryTests
{
    [Fact(DisplayName = "测试文件头读写")]
    public void TestTarHeaderReadWrite()
    {
        // 创建一个TarHeader
        var originalHeader = new TarEntry
        {
            FileName = "test.txt",
            Mode = "0000644",
            OwnerId = "0000000",
            GroupId = "0000000",
            FileSize = 1024,
            LastModified = new DateTime(2023, 1, 1, 0, 0, 0, DateTimeKind.Utc),
            Checksum = 0,
            TypeFlag = TarEntryType.RegularFile,
            LinkName = String.Empty,
            Magic = "ustar",
            Version = 0,
            OwnerName = String.Empty,
            GroupName = String.Empty,
            DeviceMajor = "0000000\0",
            DeviceMinor = "0000000\0",
            Prefix = String.Empty
        };

        // 写入内存流
        var stream = new MemoryStream();
        originalHeader.Write(stream);

        // 重置流位置以便读取
        stream.Position = 0;

        // 读取头部
        var readHeader = TarEntry.Read(stream);

        // 验证读取的头部与原始头部一致
        Assert.NotNull(readHeader);
        Assert.Equal(originalHeader.FileName, readHeader.FileName);
        Assert.Equal(originalHeader.FileSize, readHeader.FileSize);
        Assert.Equal(originalHeader.TypeFlag, readHeader.TypeFlag);
        Assert.Equal(originalHeader.Magic, readHeader.Magic);
    }

    [Fact]
    public void Test1()
    {
        // 创建一个TarHeader
        var header = new TarEntry
        {
            FileName = Rand.NextString(32),
            FileSize = Rand.Next(),
            TypeFlag = (TarEntryType)Rand.Next(0, 256),
            Magic = Rand.NextString(8),
        };

        // 写入内存流
        var stream = new MemoryStream();
        header.Write(stream);

        // 重置流位置以便读取
        stream.Position = 0;

        // 读取头部
        var header2 = TarEntry.Read(stream);

        // 验证读取的头部与原始头部一致
        Assert.NotNull(header2);
        Assert.Equal(header.FileName, header2.FileName);
        Assert.Equal(header.FileSize, header2.FileSize);
        Assert.Equal(header.TypeFlag, header2.TypeFlag);

        Assert.NotEqual(header.Magic, header2.Magic);
        Assert.Equal(header.Magic[..6], header2.Magic);
    }

    [Fact]
    public void TestFiles()
    {
        var di = "../data".AsDirectory();
        if (!di.Exists) return;

        // 遍历当前目录下的所有tar.gz文件,逐个解析文件头
        foreach (var fi in di.GetFiles("*.tar.gz"))
        {
            XTrace.WriteLine("解析Tar文件:{0}", fi.Name);

            var stream = fi.OpenRead().DecompressGZip();

            // 读取头部
            var header = TarEntry.Read(stream);

            Assert.NotNull(header);
            Assert.NotEmpty(header.FileName);
            Assert.True(header.FileSize > 0);
        }
    }
}