Files
PSMinIO/src/Utils/ZipEventArgs.cs
T
PSMinIO Developer f420effc84 Implement comprehensive zip archive functionality with progress tracking
 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.
2025-07-11 21:00:14 -04:00

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;
}
}