ITADN

Sharp Compress doesn't supports 7z writer in C# 10

#1261Opendanies8 创建于 2026-03-23
D
danies8commented
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 条评论