@@ -175,7 +175,7 @@ public static async Task DecompressArchiveAsync(IShellPage associatedInstance)
175175 await NavigationHelpers . OpenPath ( destinationFolderPath , associatedInstance , FilesystemItemType . Directory ) ;
176176 }
177177
178- public static async Task DecompressArchiveHereAsync ( IShellPage associatedInstance )
178+ public static async Task DecompressArchiveHereAsync ( IShellPage associatedInstance , bool smart = false )
179179 {
180180 if ( associatedInstance ? . SlimContentPage ? . SelectedItems == null )
181181 return ;
@@ -210,7 +210,13 @@ public static async Task DecompressArchiveHereAsync(IShellPage associatedInstanc
210210 password = Encoding . UTF8 . GetString ( decompressArchiveViewModel . Password ) ;
211211 }
212212
213- await DecompressArchiveAsync ( archive , currentFolder , password ) ;
213+ if ( smart && currentFolder is not null && await FilesystemTasks . Wrap ( ( ) => IsMultipleItems ( archive ) ) )
214+ {
215+ var destinationFolder = await FilesystemTasks . Wrap ( ( ) => currentFolder . CreateFolderAsync ( Path . GetFileNameWithoutExtension ( archive . Path ) , CreationCollisionOption . GenerateUniqueName ) . AsTask ( ) ) ;
216+ await DecompressArchiveAsync ( archive , destinationFolder , password ) ;
217+ }
218+ else
219+ await DecompressArchiveAsync ( archive , currentFolder , password ) ;
214220 }
215221 }
216222
@@ -274,5 +280,14 @@ private static async Task<bool> IsArchiveEncrypted(BaseStorageFile archive)
274280
275281 return zipFile . ArchiveFileData . Any ( file => file . Encrypted || file . Method . Contains ( "Crypto" ) || file . Method . Contains ( "AES" ) ) ;
276282 }
283+
284+ private static async Task < bool > IsMultipleItems ( BaseStorageFile archive )
285+ {
286+ using SevenZipExtractor ? zipFile = await GetZipFile ( archive ) ;
287+ if ( zipFile is null )
288+ return true ;
289+
290+ return zipFile . ArchiveFileData . Count > 1 ;
291+ }
277292 }
278293}
0 commit comments