mirror of
https://github.com/Grace-Solutions/PSMinIO.git
synced 2026-08-06 03:27:40 +00:00
f420effc84
✅ ZipArchiveBuilder - Core compression engine: • Built on System.IO.Compression (.NET Standard 2.0 built-in) • Real-time progress tracking with events • Start/end time tracking with duration calculation • Size metrics (compressed/uncompressed) and compression ratios • FileSystemInfo support (FileInfo, DirectoryInfo) • Append support via ZipArchiveMode.Update • Compression efficiency calculations ✅ ZipBuilder - PowerShell integration layer: • ThreadSafeProgressCollector integration • Multi-layer progress tracking (Zip + File levels) • Verbose logging with comprehensive metrics • ZipCreationResult object for PowerShell output • Event-driven progress reporting ✅ New-MinIOZipArchive cmdlet - Well-structured PowerShell interface: • Files parameter set: FileInfo[] support for multiple files • Directory parameter set: DirectoryInfo with recursive options • File filtering: InclusionFilter/ExclusionFilter ScriptBlocks • Compression levels: Optimal, Fastest, NoCompression • Archive modes: Create, Update (for appending) • BasePath parameter for custom entry name control • Force parameter for overwriting existing archives • PassThru parameter for detailed result objects ✅ Advanced features: • Progress tracking: Real-time speed and ETA calculations • Metrics: Compression ratio, space saved, processing time • File filtering: ScriptBlock-based inclusion/exclusion • Path handling: Cross-platform compatibility • Error handling: Comprehensive validation and recovery • Memory efficiency: 80KB buffer for optimal throughput ✅ Integration benefits: • No external dependencies (uses built-in .NET compression) • Thread-safe operations compatible with PSMinIO architecture • Consistent with existing progress tracking patterns • Minimal footprint aligning with project preferences • Enterprise-grade functionality with comprehensive metrics Architecture: Built on System.IO.Compression with custom progress tracking, providing superior zip functionality with PowerShell-native integration.
148 lines
4.2 KiB
C#
148 lines
4.2 KiB
C#
using System;
|
|
|
|
namespace PSMinIO.Utils
|
|
{
|
|
/// <summary>
|
|
/// Event arguments for zip progress updates
|
|
/// </summary>
|
|
public class ZipProgressEventArgs : EventArgs
|
|
{
|
|
/// <summary>
|
|
/// Name of the current file being processed
|
|
/// </summary>
|
|
public string CurrentFileName { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Progress percentage for the current file (0-100)
|
|
/// </summary>
|
|
public double CurrentFileProgress { get; set; }
|
|
|
|
/// <summary>
|
|
/// Bytes processed for the current file
|
|
/// </summary>
|
|
public long CurrentFileBytesProcessed { get; set; }
|
|
|
|
/// <summary>
|
|
/// Total size of the current file
|
|
/// </summary>
|
|
public long CurrentFileSize { get; set; }
|
|
|
|
/// <summary>
|
|
/// Number of files processed so far
|
|
/// </summary>
|
|
public int TotalFilesProcessed { get; set; }
|
|
|
|
/// <summary>
|
|
/// Total bytes processed across all files
|
|
/// </summary>
|
|
public long TotalBytesProcessed { get; set; }
|
|
|
|
/// <summary>
|
|
/// Elapsed time since compression started
|
|
/// </summary>
|
|
public TimeSpan ElapsedTime { get; set; }
|
|
|
|
/// <summary>
|
|
/// Current compression speed in bytes per second
|
|
/// </summary>
|
|
public double CurrentSpeed => ElapsedTime.TotalSeconds > 0 ? TotalBytesProcessed / ElapsedTime.TotalSeconds : 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Event arguments for when a file is added to the zip
|
|
/// </summary>
|
|
public class ZipFileEventArgs : EventArgs
|
|
{
|
|
/// <summary>
|
|
/// Original file name
|
|
/// </summary>
|
|
public string FileName { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Entry name in the zip archive
|
|
/// </summary>
|
|
public string EntryName { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Uncompressed size of the file
|
|
/// </summary>
|
|
public long UncompressedSize { get; set; }
|
|
|
|
/// <summary>
|
|
/// Compressed size in the zip archive
|
|
/// </summary>
|
|
public long CompressedSize { get; set; }
|
|
|
|
/// <summary>
|
|
/// Compression ratio (compressed/uncompressed)
|
|
/// </summary>
|
|
public double CompressionRatio { get; set; }
|
|
|
|
/// <summary>
|
|
/// Time taken to process this file
|
|
/// </summary>
|
|
public TimeSpan ProcessingTime { get; set; }
|
|
|
|
/// <summary>
|
|
/// Compression efficiency percentage (100 - ratio * 100)
|
|
/// </summary>
|
|
public double CompressionEfficiency => (1 - CompressionRatio) * 100;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Event arguments for when zip compression is completed
|
|
/// </summary>
|
|
public class ZipCompletedEventArgs : EventArgs
|
|
{
|
|
/// <summary>
|
|
/// Time when compression started
|
|
/// </summary>
|
|
public DateTime StartTime { get; set; }
|
|
|
|
/// <summary>
|
|
/// Time when compression completed
|
|
/// </summary>
|
|
public DateTime EndTime { get; set; }
|
|
|
|
/// <summary>
|
|
/// Total duration of compression
|
|
/// </summary>
|
|
public TimeSpan Duration { get; set; }
|
|
|
|
/// <summary>
|
|
/// Total number of files compressed
|
|
/// </summary>
|
|
public int TotalFiles { get; set; }
|
|
|
|
/// <summary>
|
|
/// Total uncompressed size of all files
|
|
/// </summary>
|
|
public long TotalUncompressedSize { get; set; }
|
|
|
|
/// <summary>
|
|
/// Total compressed size of the zip archive
|
|
/// </summary>
|
|
public long TotalCompressedSize { get; set; }
|
|
|
|
/// <summary>
|
|
/// Overall compression ratio
|
|
/// </summary>
|
|
public double CompressionRatio { get; set; }
|
|
|
|
/// <summary>
|
|
/// Average compression speed in bytes per second
|
|
/// </summary>
|
|
public double AverageCompressionSpeed { get; set; }
|
|
|
|
/// <summary>
|
|
/// Overall compression efficiency percentage
|
|
/// </summary>
|
|
public double CompressionEfficiency => (1 - CompressionRatio) * 100;
|
|
|
|
/// <summary>
|
|
/// Space saved by compression
|
|
/// </summary>
|
|
public long SpaceSaved => TotalUncompressedSize - TotalCompressedSize;
|
|
}
|
|
}
|