用aspx打包tar.gz

2025-08-27 15:51:19 5 233 1
有时候环境中无法执行命令,但又需要打包文件,可以用这个脚本aspx打包


<%@ Page Language="C#" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.Web" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            errorLabel.Text = "";
            statusLabel.Text = "";
            
            string sourceDirectory = this.sourceDirectory.Text;
            string outputPath = this.outputPath.Text;
            string patternsText = filePatterns.Text;
            
            if (string.IsNullOrEmpty(sourceDirectory) || string.IsNullOrEmpty(outputPath))
            {
                errorLabel.Text = "Directory and output file path cannot be empty";
                return;
            }
            
            if (!Directory.Exists(sourceDirectory))
            {
                errorLabel.Text = "Source directory does not exist";
                return;
            }
            
            string[] patterns = patternsText.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            
            try
            {
                CreateTarGz(sourceDirectory, outputPath, patterns);
                statusLabel.Text = "Compression completed! File saved to: " + outputPath;
            }
            catch (Exception ex)
            {
                errorLabel.Text = "Error: " + ex.Message;
            }
        }
    }

    public static void CreateTarGz(string sourceDirectory, string outputPath, string[] includePatterns)
    {
        using (var outputStream = File.Create(outputPath))
        using (var gzipStream = new GZipStream(outputStream, CompressionMode.Compress))
        {
            var files = GetFilesRecursive(sourceDirectory, includePatterns);

            foreach (var file in files)
            {
                var relativePath = file.Substring(sourceDirectory.Length + 1).Replace('\\','/');
                AddFileToTar(gzipStream, file, relativePath);
            }

            var endBlock = new byte[1024];
            gzipStream.Write(endBlock, 0, endBlock.Length);
        }
    }

    private static List<string> GetFilesRecursive(string directory, string[] patterns)
    {
        var result = new List<string>();
        foreach (var pattern in patterns)
        {
            try
            {
                result.AddRange(Directory.GetFiles(directory, pattern, SearchOption.AllDirectories));
            }
            catch
            {
            }
        }
        return result;
    }

    private static void AddFileToTar(Stream tarStream, string filePath, string entryName)
    {
        var fileInfo = new FileInfo(filePath);
        var header = CreateTarHeader(entryName, fileInfo.Length, fileInfo.LastWriteTime);
        tarStream.Write(header, 0, header.Length);

        using (var fileStream = File.OpenRead(filePath))
        {
            fileStream.CopyTo(tarStream);

            var remaining = 512 - (fileInfo.Length % 512);
            if (remaining != 512)
            {
                var padding = new byte[remaining];
                tarStream.Write(padding, 0, padding.Length);
            }
        }
    }

    private static byte[] CreateTarHeader(string fileName, long fileSize, DateTime lastModified)
    {
        var header = new byte[512];
        var ascii = Encoding.ASCII;

        var nameBytes = ascii.GetBytes(fileName);
        Array.Copy(nameBytes, header, Math.Min(nameBytes.Length, 100));

        var modeBytes = ascii.GetBytes("0000777");
        Array.Copy(modeBytes, 0, header, 100, modeBytes.Length);

        var uidBytes = ascii.GetBytes("0000000");
        Array.Copy(uidBytes, 0, header, 108, uidBytes.Length);
        Array.Copy(uidBytes, 0, header, 116, uidBytes.Length);

        var sizeStr = Convert.ToString(fileSize, 8).PadLeft(11, '0') + " ";
        var sizeBytes = ascii.GetBytes(sizeStr);
        Array.Copy(sizeBytes, 0, header, 124, sizeBytes.Length);

        var timestamp = (long)(lastModified - new DateTime(1970, 1, 1)).TotalSeconds;
        var timeStr = Convert.ToString(timestamp, 8).PadLeft(11, '0') + " ";
        var timeBytes = ascii.GetBytes(timeStr);
        Array.Copy(timeBytes, 0, header, 136, timeBytes.Length);

        header[156] = (byte)'0';

        CalculateChecksum(header);

        return header;
    }

    private static void CalculateChecksum(byte[] header)
    {
        for (int i = 148; i < 156; i++)
        {
            header[i] = (byte)' ';
        }

        uint checksum = 0;
        for (int i = 0; i < 512; i++)
        {
            checksum += header[i];
        }

        var checksumStr = Convert.ToString(checksum, 8).PadLeft(6, '0') + "\0 ";
        var checksumBytes = Encoding.ASCII.GetBytes(checksumStr);
        Array.Copy(checksumBytes, 0, header, 148, checksumBytes.Length);
    }
</script>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Directory Compression Tool</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; background-color: #f5f5f5; }
        .container { max-width: 600px; margin: 0 auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
        .form-group { margin-bottom: 15px; }
        label { display: inline-block; width: 120px; font-weight: bold; }
        input[type="text"] { width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; }
        .btn { background-color: #4CAF50; color: white; padding: 10px 15px; border: none; border-radius: 4px; cursor: pointer; }
        .btn:hover { background-color: #45a049; }
        .error { color: #d9534f; margin-top: 10px; }
        .success { color: #5cb85c; margin-top: 10px; }
        small { color: #666; }
    </style>
</head>
<body>
    <div class="container">
        <h1>Directory Compression Tool</h1>
        <form id="form1" runat="server">
            <div class="form-group">
                <label for="sourceDirectory">Source Directory:</label>
                <asp:TextBox ID="sourceDirectory" runat="server" placeholder="Example: C:\myfolder"></asp:TextBox>
            </div>
            
            <div class="form-group">
                <label for="outputPath">Output File:</label>
                <asp:TextBox ID="outputPath" runat="server" placeholder="Example: C:\output.tgz"></asp:TextBox>
            </div>
            
            <div class="form-group">
                <label for="filePatterns">File Patterns:</label>
                <asp:TextBox ID="filePatterns" runat="server" Text="*.as*,*.dll,*.config"></asp:TextBox>
                <small>(Multiple patterns separated by commas)</small>
            </div>
            
            <div class="form-group">
                <asp:Button ID="compressButton" runat="server" Text="Compress Directory" CssClass="btn" />
            </div>
            
            <asp:Label ID="statusLabel" runat="server" CssClass="success"></asp:Label>
            <asp:Label ID="errorLabel" runat="server" CssClass="error"></asp:Label>
        </form>
    </div>
</body>
</html>

自评TCV 1

关于作者

guage1篇文章4篇回复

半块西瓜皮

评论5次

要评论?请先  登录  或  注册