From 286843f9f3c305c82c66896868d9f6a3d1a7c983 Mon Sep 17 00:00:00 2001 From: Valentin Date: Thu, 13 Mar 2025 10:21:22 +0100 Subject: [PATCH] fix: zipped file remains locked after `ZipFile().CreateFromDirectory` --- .../Internal/ZipUtilities.cs | 6 ++++-- .../ZipFile/CreateFromDirectoryTests.cs | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Source/Testably.Abstractions.Compression/Internal/ZipUtilities.cs b/Source/Testably.Abstractions.Compression/Internal/ZipUtilities.cs index 024cb1a73..23194c7c9 100644 --- a/Source/Testably.Abstractions.Compression/Internal/ZipUtilities.cs +++ b/Source/Testably.Abstractions.Compression/Internal/ZipUtilities.cs @@ -96,7 +96,8 @@ internal static void CreateFromDirectory(IFileSystem fileSystem, ? archive.CreateEntry(entryName, compressionLevel.Value) : archive.CreateEntry(entryName); using Stream stream = entry.Open(); - fileInfo.OpenRead().CopyTo(stream); + using FileSystemStream fileStream = fileInfo.OpenRead(); + fileStream.CopyTo(stream); } else if (file is IDirectoryInfo directoryInfo && directoryInfo.GetFileSystemInfos().Length == 0) @@ -172,7 +173,8 @@ internal static void CreateFromDirectory( ? archive.CreateEntry(entryName, compressionLevel.Value) : archive.CreateEntry(entryName); using Stream stream = entry.Open(); - fileInfo.OpenRead().CopyTo(stream); + using FileSystemStream fileStream = fileInfo.OpenRead(); + fileStream.CopyTo(stream); } else if (file is IDirectoryInfo directoryInfo && directoryInfo.GetFileSystemInfos().Length == 0) diff --git a/Tests/Testably.Abstractions.Compression.Tests/ZipFile/CreateFromDirectoryTests.cs b/Tests/Testably.Abstractions.Compression.Tests/ZipFile/CreateFromDirectoryTests.cs index 97272c6e8..94a284725 100644 --- a/Tests/Testably.Abstractions.Compression.Tests/ZipFile/CreateFromDirectoryTests.cs +++ b/Tests/Testably.Abstractions.Compression.Tests/ZipFile/CreateFromDirectoryTests.cs @@ -374,6 +374,21 @@ await That(FileSystem).HasFile("destination/bar/test.txt") } #endif + [Fact] + public async Task ShouldNotLock() + { + string directory = "ToBeZipped"; + string archive = "zippedDirectory.zip"; + FileSystem.Directory.CreateDirectory(directory); + FileSystem.File.WriteAllText(FileSystem.Path.Combine(directory, "file.txt"), + "Some content"); + void Act() => FileSystem.Directory.Delete(directory, true); + + FileSystem.ZipFile().CreateFromDirectory(directory, archive); + + await That(Act).DoesNotThrow(); + } + #region Helpers #pragma warning disable MA0018