Skip to content

Commit add522a

Browse files
authored
feat(IZipArchiveService): compatible with older versions (#7380)
* refactor: 恢复上一个版本方法增加兼容性 * doc: 更新文档 * refactor: 重构代码 * refactor: 代码重构提高可读性 * doc: 更新文档 * test: 重构单元测试 * test: 更新单元测试 * refactor: 重构代码 * test: 增加单元测试覆盖率 * refactor: 重构代码
1 parent 395749c commit add522a

4 files changed

Lines changed: 89 additions & 23 deletions

File tree

src/BootstrapBlazor.Server/Components/Samples/ZipArchives.razor

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@page "/zip-archive"
1+
@page "/zip-archive"
22
@layout MainLayout
33
@inject IStringLocalizer<ZipArchives> Localizer
44

@@ -13,10 +13,14 @@ private IZipArchiveService? ZipArchiveService { get; set; }</Pre>
1313
<p>@Localizer["ZipArchiveFileText"]</p>
1414
<Pre class="mb-3">Task&lt;Stream&gt; ArchiveAsync(IEnumerable&lt;string&gt; files, ArchiveOptions? options = null);
1515

16-
Task ArchiveAsync(string archiveFileName, IEnumerable&lt;string&gt; files, ArchiveOptions? options = null);</Pre>
16+
Task ArchiveAsync(string archiveFile, IEnumerable&lt;string&gt; files, ArchiveOptions? options = null);
17+
18+
Task&lt;Stream&gt; ArchiveAsync(IEnumerable&lt;ArchiveEntry&gt; entries, ArchiveOptions? options = null);
19+
20+
Task ArchiveAsync(string archiveFile, IEnumerable&lt;ArchiveEntry&gt; entries, ArchiveOptions? options = null);</Pre>
1721

1822
<p>@Localizer["ZipArchiveDirectoryText"]</p>
19-
<Pre class="mb-3">Task ArchiveDirectory(string archiveFileName, string directoryName, CompressionLevel compressionLevel = CompressionLevel.Optimal, bool includeBaseDirectory = false, Encoding? encoding = null);</Pre>
23+
<Pre class="mb-3">Task ArchiveDirectoryAsync(string archiveFile, string directoryName, CompressionLevel compressionLevel = CompressionLevel.Optimal, bool includeBaseDirectory = false, Encoding? encoding = null);</Pre>
2024

2125
<p>@Localizer["ZipArchiveExtractText"]</p>
22-
<Pre class="mb-3">bool ExtractToDirectory(string archiveFile, string destinationDirectoryName, bool overwriteFiles = false, Encoding? encoding = null);</Pre>
26+
<Pre class="mb-3">Task&lt;bool&gt; ExtractToDirectoryAsync(string archiveFile, string destinationDirectoryName, bool overwriteFiles = false, Encoding? encoding = null);</Pre>

src/BootstrapBlazor/Services/DefaultZipArchiveService.cs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,24 @@ namespace BootstrapBlazor.Components;
1010

1111
class DefaultZipArchiveService : IZipArchiveService
1212
{
13+
/// <summary>
14+
/// <inheritdoc/>
15+
/// </summary>
16+
public Task<Stream> ArchiveAsync(IEnumerable<string> files, ArchiveOptions? options = null) => ArchiveAsync(files.Select(f => new ArchiveEntry()
17+
{
18+
SourceFileName = f,
19+
EntryName = Path.GetFileName(f),
20+
}), options);
21+
22+
/// <summary>
23+
/// <inheritdoc/>
24+
/// </summary>
25+
public Task ArchiveAsync(string archiveFile, IEnumerable<string> files, ArchiveOptions? options = null) => ArchiveAsync(archiveFile, files.Select(f => new ArchiveEntry()
26+
{
27+
SourceFileName = f,
28+
EntryName = Path.GetFileName(f),
29+
}), options);
30+
1331
/// <summary>
1432
/// <inheritdoc/>
1533
/// </summary>
@@ -28,7 +46,7 @@ public async Task<Stream> ArchiveAsync(IEnumerable<ArchiveEntry> entries, Archiv
2846
/// </summary>
2947
public async Task ArchiveAsync(string archiveFile, IEnumerable<ArchiveEntry> entries, ArchiveOptions? options = null)
3048
{
31-
using var stream = File.OpenWrite(archiveFile);
49+
await using var stream = File.OpenWrite(archiveFile);
3250
await ArchiveFilesAsync(stream, entries, options);
3351
}
3452

@@ -38,6 +56,11 @@ private static async Task ArchiveFilesAsync(Stream stream, IEnumerable<ArchiveEn
3856
using var archive = new ZipArchive(stream, options.Mode, options.LeaveOpen, options.Encoding);
3957
foreach (var f in entries)
4058
{
59+
if (string.IsNullOrEmpty(f.EntryName))
60+
{
61+
continue;
62+
}
63+
4164
if (options.ReadStreamAsync != null)
4265
{
4366
var entry = archive.CreateEntry(f.EntryName, options.CompressionLevel);
@@ -48,14 +71,13 @@ private static async Task ArchiveFilesAsync(Stream stream, IEnumerable<ArchiveEn
4871
else if (Directory.Exists(f.SourceFileName))
4972
{
5073
var entryName = f.EntryName;
51-
if (!string.IsNullOrEmpty(entryName))
74+
75+
if (!entryName.EndsWith('/'))
5276
{
53-
if (!entryName.EndsWith('/'))
54-
{
55-
entryName = $"{entryName}/";
56-
}
57-
archive.CreateEntry(entryName, f.CompressionLevel ?? options.CompressionLevel);
77+
entryName = $"{entryName}/";
5878
}
79+
80+
archive.CreateEntry(entryName, f.CompressionLevel ?? options.CompressionLevel);
5981
}
6082
else if (File.Exists(f.SourceFileName))
6183
{

src/BootstrapBlazor/Services/IZipArchiveService.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,22 @@ namespace BootstrapBlazor.Components;
1313
/// </summary>
1414
public interface IZipArchiveService
1515
{
16+
/// <summary>
17+
/// 将文件归档方法
18+
/// </summary>
19+
/// <param name="files">要归档的文件集合</param>
20+
/// <param name="options">归档配置</param>
21+
/// <returns>归档数据流</returns>
22+
Task<Stream> ArchiveAsync(IEnumerable<string> files, ArchiveOptions? options = null);
23+
24+
/// <summary>
25+
/// 将文件归档方法
26+
/// </summary>
27+
/// <param name="archiveFile">归档文件</param>
28+
/// <param name="files">要归档的文件集合</param>
29+
/// <param name="options">归档配置</param>
30+
Task ArchiveAsync(string archiveFile, IEnumerable<string> files, ArchiveOptions? options = null);
31+
1632
/// <summary>
1733
/// 将文件归档方法
1834
/// </summary>

test/UnitTest/Services/ZipArchiveServiceTest.cs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public async Task Archive_Ok()
1414
{
1515
var archService = Context.Services.GetRequiredService<IZipArchiveService>();
1616
var root = AppContext.BaseDirectory;
17-
var files = new string[]
17+
var files = new[]
1818
{
1919
Path.Combine(root, "1.txt"),
2020
Path.Combine(root, "2.txt")
@@ -28,16 +28,16 @@ public async Task Archive_Ok()
2828
{
2929
SourceFileName = i,
3030
EntryName = Path.GetFileName(i)
31-
});
31+
}).ToList();
3232
var stream = await archService.ArchiveAsync(items);
3333
Assert.NotNull(stream);
3434

3535
stream = await archService.ArchiveAsync(items, new ArchiveOptions()
3636
{
37-
CompressionLevel = System.IO.Compression.CompressionLevel.Optimal,
37+
CompressionLevel = CompressionLevel.Optimal,
3838
Encoding = System.Text.Encoding.UTF8,
39-
Mode = System.IO.Compression.ZipArchiveMode.Create,
40-
ReadStreamAsync = f => Task.FromResult<Stream>(new MemoryStream("A"u8.ToArray()))
39+
Mode = ZipArchiveMode.Create,
40+
ReadStreamAsync = _ => Task.FromResult<Stream>(new MemoryStream("A"u8.ToArray()))
4141
});
4242
Assert.NotNull(stream);
4343

@@ -93,8 +93,8 @@ public async Task ZipArchive_Ok()
9393
File.Delete(fileName);
9494
}
9595

96-
using var fs = File.OpenWrite(fileName);
97-
using var zip = new ZipArchive(fs, ZipArchiveMode.Create);
96+
await using var fs = File.OpenWrite(fileName);
97+
await using var zip = new ZipArchive(fs, ZipArchiveMode.Create);
9898

9999
var item = Path.Combine(AppContext.BaseDirectory, "test", "1.txt");
100100
zip.CreateEntry("text/");
@@ -111,7 +111,7 @@ public async Task ArchiveAsync_Ok()
111111
}
112112

113113
var root = AppContext.BaseDirectory;
114-
var files = new string[]
114+
var files = new[]
115115
{
116116
Path.Combine(root, "archive_test", "test1", "1.txt"),
117117
Path.Combine(root, "archive_test", "test2", "2.txt")
@@ -130,30 +130,54 @@ public async Task ArchiveAsync_Ok()
130130
var archService = Context.Services.GetRequiredService<IZipArchiveService>();
131131
await archService.ArchiveAsync(fileName, new List<ArchiveEntry>()
132132
{
133-
new ArchiveEntry()
133+
new()
134134
{
135135
SourceFileName = files[0],
136136
EntryName = "test1/test.log"
137137
},
138-
new ArchiveEntry()
138+
new()
139139
{
140140
SourceFileName = files[1],
141141
EntryName = "test2/test.log",
142142
CompressionLevel = CompressionLevel.Optimal
143143
},
144-
new ArchiveEntry()
144+
new()
145145
{
146146
SourceFileName = Path.Combine(AppContext.BaseDirectory, "archive_test", "test1"),
147147
EntryName = "test1",
148148
},
149-
new ArchiveEntry()
149+
new()
150150
{
151151
SourceFileName = Path.Combine(AppContext.BaseDirectory, "archive_test", "test1"),
152152
EntryName = "test2",
153153
CompressionLevel = CompressionLevel.Optimal
154+
},
155+
new()
156+
{
157+
SourceFileName = files[1]
154158
}
155159
});
156160

157161
Assert.True(File.Exists(fileName));
162+
163+
if (File.Exists(fileName))
164+
{
165+
File.Delete(fileName);
166+
}
167+
Assert.False(File.Exists(fileName));
168+
await archService.ArchiveAsync(fileName, new List<string>()
169+
{
170+
Path.Combine(AppContext.BaseDirectory, "archive_test", "test1", "test.log"),
171+
Path.Combine(AppContext.BaseDirectory, "archive_test", "test2", "test.log")
172+
});
173+
Assert.True(File.Exists(fileName));
174+
175+
await using var stream = await archService.ArchiveAsync(new List<string>()
176+
{
177+
Path.Combine(AppContext.BaseDirectory, "archive_test", "test1", "test.log"),
178+
Path.Combine(AppContext.BaseDirectory, "archive_test", "test2", "test.log")
179+
});
180+
Assert.NotNull(stream);
181+
Assert.True(stream.Length != 0);
158182
}
159183
}

0 commit comments

Comments
 (0)