@@ -13,63 +13,61 @@ 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 ) ;
5347 }
54- else
48+ else if ( Directory . Exists ( f . SourceFileName ) )
5549 {
56- archive . CreateEntryFromFile ( f , Path . GetFileName ( f ) , options . CompressionLevel ) ;
50+ var entryName = f . EntryName ;
51+ if ( ! string . IsNullOrEmpty ( entryName ) )
52+ {
53+ if ( ! entryName . EndsWith ( '/' ) )
54+ {
55+ entryName = $ "{ entryName } /";
56+ }
57+ archive . CreateEntry ( entryName , f . CompressionLevel ?? options . CompressionLevel ) ;
58+ }
59+ }
60+ else if ( File . Exists ( f . SourceFileName ) )
61+ {
62+ archive . CreateEntryFromFile ( f . SourceFileName , f . EntryName , f . CompressionLevel ?? options . CompressionLevel ) ;
5763 }
5864 }
5965 }
6066
6167 /// <summary>
6268 /// <inheritdoc/>
6369 /// </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 )
70+ public async Task ArchiveDirectoryAsync ( string archiveFile , string directoryName , CompressionLevel compressionLevel = CompressionLevel . Optimal , bool includeBaseDirectory = false , Encoding ? encoding = null , CancellationToken token = default )
7371 {
7472 if ( Directory . Exists ( directoryName ) )
7573 {
@@ -93,77 +91,6 @@ await Task.Run(() =>
9391 /// <summary>
9492 /// <inheritdoc/>
9593 /// </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>
16794 public async Task < bool > ExtractToDirectoryAsync ( string archiveFile , string destinationDirectoryName , bool overwriteFiles = false , Encoding ? encoding = null , CancellationToken token = default )
16895 {
16996 if ( ! Directory . Exists ( destinationDirectoryName ) )
@@ -186,11 +113,6 @@ await Task.Run(() =>
186113 /// <summary>
187114 /// <inheritdoc/>
188115 /// </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>
194116 public ZipArchiveEntry ? GetEntry ( string archiveFile , string entryFile , bool overwriteFiles = false , Encoding ? encoding = null )
195117 {
196118 using var archive = ZipFile . Open ( archiveFile , ZipArchiveMode . Read , encoding ) ;
0 commit comments