diff --git a/src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor b/src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor index 632f2d16b50..9a1b3c51453 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);
+
Task<bool> ExtractToDirectoryAsync(string archiveFile, string destinationDirectoryName, bool overwriteFiles = false, Encoding? encoding = null);
diff --git a/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs b/src/BootstrapBlazor/Services/DefaultZipArchiveService.cs index 7316bcf7c05..93e3df07ff3 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); + /// /// /// @@ -28,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); } @@ -38,6 +56,11 @@ private static async Task ArchiveFilesAsync(Stream stream, IEnumerable public interface IZipArchiveService { + /// + /// 将文件归档方法 + /// + /// 要归档的文件集合 + /// 归档配置 + /// 归档数据流 + Task ArchiveAsync(IEnumerable files, ArchiveOptions? options = null); + + /// + /// 将文件归档方法 + /// + /// 归档文件 + /// 要归档的文件集合 + /// 归档配置 + Task ArchiveAsync(string archiveFile, IEnumerable files, ArchiveOptions? options = null); + /// /// 将文件归档方法 /// diff --git a/test/UnitTest/Services/ZipArchiveServiceTest.cs b/test/UnitTest/Services/ZipArchiveServiceTest.cs index 0e5bd852e74..ebc07340345 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,30 +130,54 @@ 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", CompressionLevel = CompressionLevel.Optimal + }, + new() + { + SourceFileName = files[1] } }); 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)); + + 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); } }