@@ -13,63 +13,62 @@ class DefaultZipArchiveService : IZipArchiveService
1313 /// <summary>
1414 /// <inheritdoc/>
1515 /// </summary>
16- /// <param name="files">要归档的文件集合</param>
17- /// <param name="options">归档配置</param>
18- /// <returns>归档数据流</returns>
19- public async Task < Stream > ArchiveAsync ( IEnumerable < string > files , ArchiveOptions ? options = null )
16+ public async Task < Stream > ArchiveAsync ( IEnumerable < ArchiveEntry > entries , ArchiveOptions ? options = null )
2017 {
2118 var stream = new MemoryStream ( ) ;
2219 options ??= new ArchiveOptions ( ) ;
2320 options . LeaveOpen = true ;
24- await ArchiveFilesAsync ( stream , files , options ) ;
21+ await ArchiveFilesAsync ( stream , entries , options ) ;
2522 stream . Position = 0 ;
2623 return stream ;
2724 }
2825
2926 /// <summary>
3027 /// <inheritdoc/>
3128 /// </summary>
32- /// <param name="archiveFile">归档文件</param>
33- /// <param name="files">要归档的文件集合</param>
34- /// <param name="options">归档配置</param>
35- public async Task ArchiveAsync ( string archiveFile , IEnumerable < string > files , ArchiveOptions ? options = null )
29+ public async Task ArchiveAsync ( string archiveFile , IEnumerable < ArchiveEntry > entries , ArchiveOptions ? options = null )
3630 {
3731 using var stream = File . OpenWrite ( archiveFile ) ;
38- await ArchiveFilesAsync ( stream , files , options ) ;
32+ await ArchiveFilesAsync ( stream , entries , options ) ;
3933 }
4034
41- private static async Task ArchiveFilesAsync ( Stream stream , IEnumerable < string > files , ArchiveOptions ? options = null )
35+ private static async Task ArchiveFilesAsync ( Stream stream , IEnumerable < ArchiveEntry > entries , ArchiveOptions ? options = null )
4236 {
4337 options ??= new ArchiveOptions ( ) ;
4438 using var archive = new ZipArchive ( stream , options . Mode , options . LeaveOpen , options . Encoding ) ;
45- foreach ( var f in files )
39+ foreach ( var f in entries )
4640 {
4741 if ( options . ReadStreamAsync != null )
4842 {
49- var entry = archive . CreateEntry ( Path . GetFileName ( f ) , options . CompressionLevel ) ;
50- using var entryStream = entry . Open ( ) ;
51- await using var content = await options . ReadStreamAsync ( f ) ;
43+ var entry = archive . CreateEntry ( f . EntryName , options . CompressionLevel ) ;
44+ await using var content = await options . ReadStreamAsync ( f . SourceFileName ) ;
45+ await using var entryStream = entry . Open ( ) ;
5246 await content . CopyToAsync ( entryStream ) ;
47+ entryStream . Close ( ) ;
48+ }
49+ else if ( Directory . Exists ( f . SourceFileName ) )
50+ {
51+ var entryName = f . EntryName ;
52+ if ( ! string . IsNullOrEmpty ( entryName ) )
53+ {
54+ if ( ! entryName . EndsWith ( Path . DirectorySeparatorChar ) )
55+ {
56+ entryName = $ "{ entryName } { Path . DirectorySeparatorChar } ";
57+ }
58+ archive . CreateEntry ( entryName , f . CompressionLevel ?? options . CompressionLevel ) ;
59+ }
5360 }
5461 else
5562 {
56- archive . CreateEntryFromFile ( f , Path . GetFileName ( f ) , options . CompressionLevel ) ;
63+ archive . CreateEntryFromFile ( f . SourceFileName , f . EntryName , f . CompressionLevel ?? options . CompressionLevel ) ;
5764 }
5865 }
5966 }
6067
6168 /// <summary>
6269 /// <inheritdoc/>
6370 /// </summary>
64- /// <param name="archiveFile"></param>
65- /// <param name="directoryName"></param>
66- /// <param name="compressionLevel"></param>
67- /// <param name="includeBaseDirectory"></param>
68- /// <param name="encoding"></param>
69- /// <param name="token"></param>
70- /// <returns></returns>
71- /// <exception cref="NotImplementedException"></exception>
72- public async Task ArchiveDirectory ( string archiveFile , string directoryName , CompressionLevel compressionLevel = CompressionLevel . Optimal , bool includeBaseDirectory = false , Encoding ? encoding = null , CancellationToken token = default )
71+ public async Task ArchiveDirectoryAsync ( string archiveFile , string directoryName , CompressionLevel compressionLevel = CompressionLevel . Optimal , bool includeBaseDirectory = false , Encoding ? encoding = null , CancellationToken token = default )
7372 {
7473 if ( Directory . Exists ( directoryName ) )
7574 {
@@ -93,77 +92,6 @@ await Task.Run(() =>
9392 /// <summary>
9493 /// <inheritdoc/>
9594 /// </summary>
96- /// <param name="archiveFile">归档文件</param>
97- /// <param name="entries"></param>
98- /// <param name="compressionLevel"></param>
99- /// <param name="encoding"></param>
100- /// <param name="skipEmptyFolder"></param>
101- /// <param name="token"></param>
102- /// <returns></returns>
103- /// <exception cref="NotImplementedException"></exception>
104- public async Task ArchiveDirectory ( string archiveFile , IEnumerable < string > entries , CompressionLevel compressionLevel = CompressionLevel . Optimal , Encoding ? encoding = null , bool skipEmptyFolder = false , CancellationToken token = default )
105- {
106- using var archive = ZipFile . Open ( archiveFile , ZipArchiveMode . Create , encoding ) ;
107-
108- foreach ( var entry in entries )
109- {
110- if ( Directory . Exists ( entry ) )
111- {
112- AddFolderToZip ( archive , entry , Path . GetFileName ( entry ) , compressionLevel ) ;
113- }
114- else if ( File . Exists ( entry ) )
115- {
116- archive . CreateEntryFromFile ( entry , Path . GetFileName ( entry ) , compressionLevel ) ;
117- }
118- }
119- }
120-
121- private static void AddFolderToZip ( ZipArchive archive , string folderPath , string relativePath , CompressionLevel compressionLevel = CompressionLevel . Optimal )
122- {
123- archive . CreateEntry ( $ "{ relativePath } /", compressionLevel ) ;
124-
125- // 添加当前文件夹中的所有文件
126- foreach ( string filePath in Directory . GetFiles ( folderPath ) )
127- {
128- string entryName = Path . Combine ( relativePath , Path . GetFileName ( filePath ) ) ;
129- archive . CreateEntryFromFile ( filePath , entryName , compressionLevel ) ;
130- }
131-
132- // 递归添加所有子文件夹
133- foreach ( string subfolderPath in Directory . GetDirectories ( folderPath ) )
134- {
135- string newRelativePath = Path . Combine ( relativePath , Path . GetFileName ( subfolderPath ) ) ;
136- AddFolderToZip ( archive , subfolderPath , newRelativePath , compressionLevel ) ;
137- }
138- }
139-
140- /// <summary>
141- /// <inheritdoc/>
142- /// </summary>
143- /// <param name="archiveFile">归档文件</param>
144- /// <param name="destinationDirectoryName">解压缩文件夹</param>
145- /// <param name="overwriteFiles">是否覆盖文件 默认 false 不覆盖</param>
146- /// <param name="encoding">编码方式 默认 null 内部使用 UTF-8</param>
147- /// <returns></returns>
148- public bool ExtractToDirectory ( string archiveFile , string destinationDirectoryName , bool overwriteFiles = false , Encoding ? encoding = null )
149- {
150- if ( ! Directory . Exists ( destinationDirectoryName ) )
151- {
152- Directory . CreateDirectory ( destinationDirectoryName ) ;
153- }
154- ZipFile . ExtractToDirectory ( archiveFile , destinationDirectoryName , encoding , overwriteFiles ) ;
155- return true ;
156- }
157-
158- /// <summary>
159- /// <inheritdoc/>
160- /// </summary>
161- /// <param name="archiveFile"></param>
162- /// <param name="destinationDirectoryName"></param>
163- /// <param name="overwriteFiles"></param>
164- /// <param name="encoding"></param>
165- /// <param name="token"></param>
166- /// <returns></returns>
16795 public async Task < bool > ExtractToDirectoryAsync ( string archiveFile , string destinationDirectoryName , bool overwriteFiles = false , Encoding ? encoding = null , CancellationToken token = default )
16896 {
16997 if ( ! Directory . Exists ( destinationDirectoryName ) )
@@ -186,11 +114,6 @@ await Task.Run(() =>
186114 /// <summary>
187115 /// <inheritdoc/>
188116 /// </summary>
189- /// <param name="archiveFile">归档文件</param>
190- /// <param name="entryFile">解压缩文件</param>
191- /// <param name="overwriteFiles">是否覆盖文件 默认 false 不覆盖</param>
192- /// <param name="encoding">编码方式 默认 null 内部使用 UTF-8</param>
193- /// <returns></returns>
194117 public ZipArchiveEntry ? GetEntry ( string archiveFile , string entryFile , bool overwriteFiles = false , Encoding ? encoding = null )
195118 {
196119 using var archive = ZipFile . Open ( archiveFile , ZipArchiveMode . Read , encoding ) ;
0 commit comments