public async void ExtractItems_Click(object sender, RoutedEventArgs e) { StorageFile selectedItem = null; if (CurrentInstance.ContentFrame.CurrentSourcePageType == typeof(GenericFileBrowser)) { var page = (CurrentInstance.ContentPage as GenericFileBrowser); selectedItem = await StorageFile.GetFileFromPathAsync(CurrentInstance.ViewModel.FilesAndFolders[page.AllView.SelectedIndex].FilePath); } else if (CurrentInstance.ContentFrame.CurrentSourcePageType == typeof(PhotoAlbum)) { var page = (CurrentInstance.ContentPage as PhotoAlbum); selectedItem = await StorageFile.GetFileFromPathAsync(CurrentInstance.ViewModel.FilesAndFolders[page.FileList.SelectedIndex].FilePath); } ExtractFilesDialog extractFilesDialog = new ExtractFilesDialog(CurrentInstance.ViewModel.Universal.WorkingDirectory); await extractFilesDialog.ShowAsync(); if (((bool)ApplicationData.Current.LocalSettings.Values["Extract_Destination_Cancelled"]) == false) { var bufferItem = await selectedItem.CopyAsync(ApplicationData.Current.TemporaryFolder, selectedItem.DisplayName, NameCollisionOption.ReplaceExisting); string destinationPath = ApplicationData.Current.LocalSettings.Values["Extract_Destination_Path"].ToString(); //ZipFile.ExtractToDirectory(selectedItem.Path, destinationPath, ); var destFolder_InBuffer = await ApplicationData.Current.TemporaryFolder.CreateFolderAsync(selectedItem.DisplayName + "_Extracted", CreationCollisionOption.ReplaceExisting); using (FileStream fs = new FileStream(bufferItem.Path, FileMode.Open)) { ZipArchive zipArchive = new ZipArchive(fs); int totalCount = zipArchive.Entries.Count; int index = 0; (App.CurrentInstance.ContentPage as BaseLayout).AssociatedViewModel.LoadIndicator.isVisible = Visibility.Visible; foreach (ZipArchiveEntry archiveEntry in zipArchive.Entries) { archiveEntry.ExtractToFile(destFolder_InBuffer.Path + "\\" + archiveEntry.Name); index++; if (index == totalCount) { (App.CurrentInstance.ContentPage as BaseLayout).AssociatedViewModel.LoadIndicator.isVisible = Visibility.Collapsed; } } CloneDirectoryAsync(destFolder_InBuffer.Path, destinationPath, destFolder_InBuffer.Name, true); await destFolder_InBuffer.DeleteAsync(StorageDeleteOption.PermanentDelete); Frame rootFrame = Window.Current.Content as Frame; var instanceTabsView = rootFrame.Content as InstanceTabsView; instanceTabsView.AddNewTab(typeof(ProHome), destinationPath + "\\" + selectedItem.DisplayName); } } else if (((bool)ApplicationData.Current.LocalSettings.Values["Extract_Destination_Cancelled"]) == true) { return; } }
public async void ExtractItems_Click(object sender, RoutedEventArgs e) { var selectedIndex = CurrentInstance.ContentPage.GetSelectedIndex(); StorageFile selectedItem = await StorageFile.GetFileFromPathAsync(CurrentInstance.ViewModel.FilesAndFolders[selectedIndex].ItemPath); ExtractFilesDialog extractFilesDialog = new ExtractFilesDialog(CurrentInstance.ViewModel.WorkingDirectory); await extractFilesDialog.ShowAsync(); if (((bool)ApplicationData.Current.LocalSettings.Values["Extract_Destination_Cancelled"]) == false) { var bufferItem = await selectedItem.CopyAsync(ApplicationData.Current.TemporaryFolder, selectedItem.DisplayName, NameCollisionOption.ReplaceExisting); string destinationPath = ApplicationData.Current.LocalSettings.Values["Extract_Destination_Path"].ToString(); //ZipFile.ExtractToDirectory(selectedItem.Path, destinationPath, ); var destFolder_InBuffer = await ApplicationData.Current.TemporaryFolder.CreateFolderAsync(selectedItem.DisplayName + "_Extracted", CreationCollisionOption.ReplaceExisting); using FileStream fs = new FileStream(bufferItem.Path, FileMode.Open); ZipArchive zipArchive = new ZipArchive(fs); int totalCount = zipArchive.Entries.Count; int index = 0; (App.CurrentInstance.ContentPage as BaseLayout).AssociatedViewModel.LoadIndicator.IsVisible = Visibility.Visible; foreach (ZipArchiveEntry archiveEntry in zipArchive.Entries) { if (archiveEntry.FullName.Contains('/')) { var nestedDirectories = archiveEntry.FullName.Split('/').ToList(); nestedDirectories.Remove(nestedDirectories.Last()); var relativeOutputPathToEntry = Path.Combine(nestedDirectories.ToArray()); System.IO.Directory.CreateDirectory(Path.Combine(destFolder_InBuffer.Path, relativeOutputPathToEntry)); } if (!string.IsNullOrWhiteSpace(archiveEntry.Name)) { archiveEntry.ExtractToFile(Path.Combine(destFolder_InBuffer.Path, archiveEntry.FullName)); } index++; if (index == totalCount) { (App.CurrentInstance.ContentPage as BaseLayout).AssociatedViewModel.LoadIndicator.IsVisible = Visibility.Collapsed; } } await CloneDirectoryAsync(destFolder_InBuffer.Path, destinationPath, destFolder_InBuffer.Name, true) .ContinueWith(async(x) => { await destFolder_InBuffer.DeleteAsync(StorageDeleteOption.PermanentDelete); await CoreApplication.MainView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { Frame rootFrame = Window.Current.Content as Frame; var instanceTabsView = rootFrame.Content as InstanceTabsView; instanceTabsView.AddNewTab(typeof(ModernShellPage), destinationPath + "\\" + selectedItem.DisplayName + "_Extracted"); }); }); } else if (((bool)ApplicationData.Current.LocalSettings.Values["Extract_Destination_Cancelled"]) == true) { return; } }