Sharp Compress doesn't supports 7z writer in C# 10
Hi,
**Error**: Archive Type does not have a Writer: SevenZip
**I fall on this row:**
**using var writer = WriterFactory.OpenWriter(stream, ArchiveType.SevenZip, options);**
How can I support : Creating a 7Z archive from a file or directory ?
Thanks in advance,
**My code in C# 10:**
```
` /// <summary>
/// Creates a 7Z archive from a file or directory.
/// </summary>
/// <param name="src">Source path to archive.</param>
/// <param name="dest">Destination .7z file path.</param>
/// <returns>ArchiveResult describing success or failure.</returns>
/// <remarks>
/// Contract:
/// - Internal helper that assumes overwrite policy was enforced by <see cref="Create"/>.
/// - Uses SharpCompress with LZMA compression to create .7z archives.
/// - The method asserts the precondition and returns a failure if misused.
/// </remarks>
public static ArchiveResult Create7z(string src, string dest)
{
// Invariant: overwrite policy is enforced by Create().
// This method assumes the destination does NOT exist.
// If it does, it indicates incorrect usage (bypassing Create()).
if (File.Exists(dest))
{
Log.Error($"Internal misuse: overwrite not handled for '{dest}'");
return ArchiveResult.Fail("Internal overwrite policy violation.");
}
Log.Info($"Creating 7Z archive. Source='{src}', Dest='{dest}'");
string? tempSrcDir = null;
var srcToWrite = src;
try
{
// If caller passed a single file, create a temporary directory containing that file
// because WriterFactory.WriteAll expects a directory input.
if (File.Exists(src))
{
tempSrcDir = Path.Combine(Path.GetTempPath(), "ArchiveCreator_Temp", Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(tempSrcDir);
var fileName = Path.GetFileName(src);
File.Copy(src, Path.Combine(tempSrcDir, fileName));
srcToWrite = tempSrcDir;
}
using var stream = File.Create(dest);
var options = new WriterOptions(CompressionType.LZMA);
using var writer = WriterFactory.OpenWriter(stream, ArchiveType.SevenZip, options);
writer.WriteAll(srcToWrite, "*", SearchOption.AllDirectories);
Log.Info($"7Z archive created successfully: {dest}");
return ArchiveResult.Ok("7Z archive created successfully.");
}
catch (Exception ex)
{
Log.Error($"7Z creation failed: {ex.Message}", ex);
return ArchiveResult.Fail($"7Z creation failed: {ex.Message}");
}
finally
{
if (!string.IsNullOrEmpty(tempSrcDir))
{
try
{
if (Directory.Exists(tempSrcDir))
Directory.Delete(tempSrcDir, recursive: true);
}
catch (Exception ex)
{
Log.Warn($"Failed to delete temporary source dir '{tempSrcDir}': {ex.Message}");
}
}
}
}
```
`
**Test:**
```
[Theory]
[InlineData(".7z")]
public void Create_CreatesArchive_ForDirectoryExtensions(string extension)
{
var srcDir = CreateTempDirectory();
var srcFile = Path.Combine(srcDir, "file.txt");
File.WriteAllText(srcFile, "payload");
var outDir = CreateTempDirectory();
var output = Path.Combine(outDir, "archive" + extension);
try
{
var result = ArchiveCreator.Create7z(srcDir, output);
Assert.NotNull(result);
Assert.True(result.Success, $"Expected success for extension '{extension}'. Message: {result.Message}");
Assert.True(File.Exists(output), $"Expected output file to exist for '{output}'");
}
finally
{
// Cleanup
try
{
if (Directory.Exists(srcDir))
Directory.Delete(srcDir, recursive: true);
}
catch (Exception ex)
{
Debug.WriteLine($"Cleanup failed for {srcDir}: {ex.Message}");
}
try
{
if (File.Exists(output))
File.Delete(output);
}
catch (Exception ex)
{
Debug.WriteLine($"Cleanup failed for {output}: {ex.Message}");
}
try
{
if (Directory.Exists(outDir))
Directory.Delete(outDir, recursive: true);
}
catch (Exception ex)
{
Debug.WriteLine($"Cleanup failed for {outDir}: {ex.Message}");
}
}
}
private static string CreateTempDirectory()
{
var dir = Path.Combine(Path.GetTempPath(), "ArchiveCreatorExtTests", Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(dir);
return dir;
}
```
0 条评论