Anul 3 Semestrul 2
This commit is contained in:
+68
@@ -0,0 +1,68 @@
|
||||
using System;
|
||||
using System.Formats.Tar;
|
||||
using FileCompression.Interfaces;
|
||||
using FileCompression.Utils;
|
||||
|
||||
namespace FileCompression.Services.Strategies;
|
||||
|
||||
public class TarGzStrategy : ICompressionStrategy
|
||||
{
|
||||
public void CompressFile(string sourcePath, string destinationPath, string basePath)
|
||||
{
|
||||
Console.WriteLine($"Compressing {sourcePath} to {destinationPath} using tar and gzip.");
|
||||
string tempPath = Path.GetTempFileName();
|
||||
using (var tempStream = new FileStream(tempPath, FileMode.Create, FileAccess.Write))
|
||||
using (var tempWriter = new TarWriter(tempStream, TarEntryFormat.Pax))
|
||||
{
|
||||
// Copy existing entries to temp file
|
||||
if (File.Exists(destinationPath))
|
||||
{
|
||||
using (var originalStream = new FileStream(destinationPath, FileMode.Open, FileAccess.Read))
|
||||
using (var tarReader = new TarReader(originalStream, leaveOpen: false))
|
||||
{
|
||||
TarEntry? entry;
|
||||
while ((entry = tarReader.GetNextEntry()) is not null)
|
||||
{
|
||||
tempWriter.WriteEntry(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add new entry
|
||||
string entryName = ArchiveUtils.EntryFromPath(sourcePath.AsSpan(basePath.Length));
|
||||
tempWriter.WriteEntry(sourcePath, entryName);
|
||||
}
|
||||
|
||||
File.Copy(tempPath, destinationPath, overwrite: true);
|
||||
File.Delete(tempPath);
|
||||
|
||||
}
|
||||
|
||||
public void CompressDirectory(string sourcePath, string destinationPath, string basePath)
|
||||
{
|
||||
Console.WriteLine($"Compressing {sourcePath} to {destinationPath} using tar and gzip.");
|
||||
string tempPath = Path.GetTempFileName();
|
||||
using (var tempStream = new FileStream(tempPath, FileMode.Create, FileAccess.Write))
|
||||
using (var tempWriter = new TarWriter(tempStream, TarEntryFormat.Pax))
|
||||
{
|
||||
// Copy existing entries to temp file
|
||||
if (File.Exists(destinationPath))
|
||||
{
|
||||
using (var originalStream = new FileStream(destinationPath, FileMode.Open, FileAccess.Read))
|
||||
using (var tarReader = new TarReader(originalStream, leaveOpen: false))
|
||||
{
|
||||
TarEntry? entry;
|
||||
while ((entry = tarReader.GetNextEntry()) is not null)
|
||||
{
|
||||
tempWriter.WriteEntry(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add new entry
|
||||
string entryName = ArchiveUtils.EntryFromPath(sourcePath.AsSpan(basePath.Length), appendPathSeparator: true);
|
||||
tempWriter.WriteEntry(sourcePath, entryName);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user