From 762796c05577e6686a76f2653c62ae5e56f14e98 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 19 Dec 2025 17:29:20 +0800 Subject: [PATCH 01/10] =?UTF-8?q?refactor:=20=E6=81=A2=E5=A4=8D=E4=B8=8A?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E7=89=88=E6=9C=AC=E6=96=B9=E6=B3=95=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DefaultZipArchiveService.cs | 18 ++++++++++++++++++ .../Services/IZipArchiveService.cs | 16 ++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs b/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs index 7316bcf7c05..93943b0a9e8 100644 --- a/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs +++ b/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs @@ -10,6 +10,24 @@ namespace BootstrapBlazor.Components; class DefaultZipArchiveService : IZipArchiveService { + /// + /// + /// + public Task ArchiveAsync(IEnumerable files, ArchiveOptions? options = null) => ArchiveAsync(files.Select(f => new ArchiveEntry() + { + SourceFileName = f, + EntryName = Path.GetFileName(f), + }), options); + + /// + /// + /// + public Task ArchiveAsync(string archiveFile, IEnumerable files, ArchiveOptions? options = null) => ArchiveAsync(archiveFile, files.Select(f => new ArchiveEntry() + { + SourceFileName = f, + EntryName = Path.GetFileName(f), + }), options); + /// /// /// diff --git a/src/BootstrapBlazor/Services/IZipArchiveService.cs b/src/BootstrapBlazor/Services/IZipArchiveService.cs index 1c07398afbe..65c6eff4ee2 100644 --- a/src/BootstrapBlazor/Services/IZipArchiveService.cs +++ b/src/BootstrapBlazor/Services/IZipArchiveService.cs @@ -13,6 +13,22 @@ namespace BootstrapBlazor.Components; /// public interface IZipArchiveService { + /// + /// 将文件归档方法 + /// + /// 要归档的文件集合 + /// 归档配置 + /// 归档数据流 + Task ArchiveAsync(IEnumerable files, ArchiveOptions? options = null); + + /// + /// 将文件归档方法 + /// + /// 归档文件 + /// 要归档的文件集合 + /// 归档配置 + Task ArchiveAsync(string archiveFile, IEnumerable files, ArchiveOptions? options = null); + /// /// 将文件归档方法 /// From 9e6f01d00282865129526235588d0d63241302af Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 20 Dec 2025 12:23:25 +0800 Subject: [PATCH 02/10] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/ZipArchives.razor | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor b/src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor index 632f2d16b50..822759ae042 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor @@ -1,4 +1,4 @@ -@page "/zip-archive" +@page "/zip-archive" @layout MainLayout @inject IStringLocalizer Localizer @@ -13,10 +13,14 @@ private IZipArchiveService? ZipArchiveService { get; set; }

@Localizer["ZipArchiveFileText"]

Task<Stream> ArchiveAsync(IEnumerable<string> files, ArchiveOptions? options = null);
 
-Task ArchiveAsync(string archiveFileName, IEnumerable<string> files, ArchiveOptions? options = null);
+Task ArchiveAsync(string archiveFile, IEnumerable<string> files, ArchiveOptions? options = null); + +Task<Stream> ArchiveAsync(IEnumerable<ArchiveEntry> entries, ArchiveOptions? options = null); + +Task ArchiveAsync(string archiveFile, IEnumerable<ArchiveEntry> entries, ArchiveOptions? options = null);

@Localizer["ZipArchiveDirectoryText"]

-
Task ArchiveDirectory(string archiveFileName, string directoryName, CompressionLevel compressionLevel = CompressionLevel.Optimal, bool includeBaseDirectory = false, Encoding? encoding = null);
+
Task ArchiveDirectoryAsync(string archiveFile, string directoryName, CompressionLevel compressionLevel = CompressionLevel.Optimal, bool includeBaseDirectory = false, Encoding? encoding = null);

@Localizer["ZipArchiveExtractText"]

-
bool ExtractToDirectory(string archiveFile, string destinationDirectoryName, bool overwriteFiles = false, Encoding? encoding = null);
+
bool ExtractToDirectoryAsync(string archiveFile, string destinationDirectoryName, bool overwriteFiles = false, Encoding? encoding = null);
From b666823f73fca9556f3783becfb1c5762f685953 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 20 Dec 2025 12:29:52 +0800 Subject: [PATCH 03/10] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Services/DefaultZipArchiveService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs b/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs index 93943b0a9e8..d7cb5c8df4b 100644 --- a/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs +++ b/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs @@ -46,7 +46,7 @@ public async Task ArchiveAsync(IEnumerable entries, Archiv /// public async Task ArchiveAsync(string archiveFile, IEnumerable entries, ArchiveOptions? options = null) { - using var stream = File.OpenWrite(archiveFile); + await using var stream = File.OpenWrite(archiveFile); await ArchiveFilesAsync(stream, entries, options); } From 57fe056a34430639e0d02107cc90639dd5e579d5 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 20 Dec 2025 12:50:05 +0800 Subject: [PATCH 04/10] =?UTF-8?q?refactor:=20=E4=BB=A3=E7=A0=81=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E6=8F=90=E9=AB=98=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DefaultZipArchiveService.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs b/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs index d7cb5c8df4b..ce7e816ff6c 100644 --- a/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs +++ b/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs @@ -66,14 +66,16 @@ private static async Task ArchiveFilesAsync(Stream stream, IEnumerable Date: Sat, 20 Dec 2025 18:27:17 +0800 Subject: [PATCH 05/10] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor b/src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor index 822759ae042..9a1b3c51453 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor @@ -23,4 +23,4 @@ Task ArchiveAsync(string archiveFile, IEnumerable<ArchiveEntry> entries, A
Task ArchiveDirectoryAsync(string archiveFile, string directoryName, CompressionLevel compressionLevel = CompressionLevel.Optimal, bool includeBaseDirectory = false, Encoding? encoding = null);

@Localizer["ZipArchiveExtractText"]

-
bool ExtractToDirectoryAsync(string archiveFile, string destinationDirectoryName, bool overwriteFiles = false, Encoding? encoding = null);
+
Task<bool> ExtractToDirectoryAsync(string archiveFile, string destinationDirectoryName, bool overwriteFiles = false, Encoding? encoding = null);
From 1c4d451b0fec8c7a078ef9d795832a0d5ff7ab84 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 20 Dec 2025 18:39:07 +0800 Subject: [PATCH 06/10] =?UTF-8?q?test:=20=E9=87=8D=E6=9E=84=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ZipArchiveServiceTest.cs | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/test/UnitTest/Services/ZipArchiveServiceTest.cs b/test/UnitTest/Services/ZipArchiveServiceTest.cs index 0e5bd852e74..4e3d15efb5b 100644 --- a/test/UnitTest/Services/ZipArchiveServiceTest.cs +++ b/test/UnitTest/Services/ZipArchiveServiceTest.cs @@ -14,7 +14,7 @@ public async Task Archive_Ok() { var archService = Context.Services.GetRequiredService(); var root = AppContext.BaseDirectory; - var files = new string[] + var files = new[] { Path.Combine(root, "1.txt"), Path.Combine(root, "2.txt") @@ -28,16 +28,16 @@ public async Task Archive_Ok() { SourceFileName = i, EntryName = Path.GetFileName(i) - }); + }).ToList(); var stream = await archService.ArchiveAsync(items); Assert.NotNull(stream); stream = await archService.ArchiveAsync(items, new ArchiveOptions() { - CompressionLevel = System.IO.Compression.CompressionLevel.Optimal, + CompressionLevel = CompressionLevel.Optimal, Encoding = System.Text.Encoding.UTF8, - Mode = System.IO.Compression.ZipArchiveMode.Create, - ReadStreamAsync = f => Task.FromResult(new MemoryStream("A"u8.ToArray())) + Mode = ZipArchiveMode.Create, + ReadStreamAsync = _ => Task.FromResult(new MemoryStream("A"u8.ToArray())) }); Assert.NotNull(stream); @@ -93,8 +93,8 @@ public async Task ZipArchive_Ok() File.Delete(fileName); } - using var fs = File.OpenWrite(fileName); - using var zip = new ZipArchive(fs, ZipArchiveMode.Create); + await using var fs = File.OpenWrite(fileName); + await using var zip = new ZipArchive(fs, ZipArchiveMode.Create); var item = Path.Combine(AppContext.BaseDirectory, "test", "1.txt"); zip.CreateEntry("text/"); @@ -111,7 +111,7 @@ public async Task ArchiveAsync_Ok() } var root = AppContext.BaseDirectory; - var files = new string[] + var files = new[] { Path.Combine(root, "archive_test", "test1", "1.txt"), Path.Combine(root, "archive_test", "test2", "2.txt") @@ -130,23 +130,23 @@ public async Task ArchiveAsync_Ok() var archService = Context.Services.GetRequiredService(); await archService.ArchiveAsync(fileName, new List() { - new ArchiveEntry() + new() { SourceFileName = files[0], EntryName = "test1/test.log" }, - new ArchiveEntry() + new() { SourceFileName = files[1], EntryName = "test2/test.log", CompressionLevel = CompressionLevel.Optimal }, - new ArchiveEntry() + new() { SourceFileName = Path.Combine(AppContext.BaseDirectory, "archive_test", "test1"), EntryName = "test1", }, - new ArchiveEntry() + new() { SourceFileName = Path.Combine(AppContext.BaseDirectory, "archive_test", "test1"), EntryName = "test2", @@ -155,5 +155,17 @@ public async Task ArchiveAsync_Ok() }); Assert.True(File.Exists(fileName)); + + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + Assert.False(File.Exists(fileName)); + await archService.ArchiveAsync(fileName, new List() + { + Path.Combine(AppContext.BaseDirectory, "archive_test", "test1", "test.log"), + Path.Combine(AppContext.BaseDirectory, "archive_test", "test2", "test.log") + }); + Assert.True(File.Exists(fileName)); } } From 648b5d7d358a999abb692277ebf587eeaad13d9d Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 20 Dec 2025 18:43:18 +0800 Subject: [PATCH 07/10] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Services/ZipArchiveServiceTest.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/UnitTest/Services/ZipArchiveServiceTest.cs b/test/UnitTest/Services/ZipArchiveServiceTest.cs index 4e3d15efb5b..379f23a5131 100644 --- a/test/UnitTest/Services/ZipArchiveServiceTest.cs +++ b/test/UnitTest/Services/ZipArchiveServiceTest.cs @@ -167,5 +167,13 @@ public async Task ArchiveAsync_Ok() Path.Combine(AppContext.BaseDirectory, "archive_test", "test2", "test.log") }); Assert.True(File.Exists(fileName)); + + await using var stream = await archService.ArchiveAsync(new List() + { + Path.Combine(AppContext.BaseDirectory, "archive_test", "test1", "test.log"), + Path.Combine(AppContext.BaseDirectory, "archive_test", "test2", "test.log") + }); + Assert.NotNull(stream); + Assert.True(stream.Length != 0); } } From 97752a0ade4a941e84284971416e8d83ac023fab Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 20 Dec 2025 18:44:47 +0800 Subject: [PATCH 08/10] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Services/DefaultZipArchiveService.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs b/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs index ce7e816ff6c..8117d49d3f6 100644 --- a/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs +++ b/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs @@ -70,7 +70,6 @@ private static async Task ArchiveFilesAsync(Stream stream, IEnumerable Date: Sat, 20 Dec 2025 18:53:30 +0800 Subject: [PATCH 09/10] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95=E8=A6=86=E7=9B=96=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Services/ZipArchiveServiceTest.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/UnitTest/Services/ZipArchiveServiceTest.cs b/test/UnitTest/Services/ZipArchiveServiceTest.cs index 379f23a5131..ebc07340345 100644 --- a/test/UnitTest/Services/ZipArchiveServiceTest.cs +++ b/test/UnitTest/Services/ZipArchiveServiceTest.cs @@ -151,6 +151,10 @@ public async Task ArchiveAsync_Ok() SourceFileName = Path.Combine(AppContext.BaseDirectory, "archive_test", "test1"), EntryName = "test2", CompressionLevel = CompressionLevel.Optimal + }, + new() + { + SourceFileName = files[1] } }); From e61595fdf7d110aa49e60467ce0a6786d3f8506d Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 20 Dec 2025 19:15:03 +0800 Subject: [PATCH 10/10] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DefaultZipArchiveService.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs b/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs index 8117d49d3f6..93e3df07ff3 100644 --- a/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs +++ b/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs @@ -56,6 +56,11 @@ private static async Task ArchiveFilesAsync(Stream stream, IEnumerable