Skip to content

Commit 354a0fa

Browse files
committed
Initial Compressed Archive Extraction Support
1 parent 73c879b commit 354a0fa

File tree

8 files changed

+187
-0
lines changed

8 files changed

+187
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<ContentDialog
2+
x:Class="Files.Dialogs.ExtractFilesDialog"
3+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5+
xmlns:local="using:Files.Dialogs"
6+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
8+
mc:Ignorable="d"
9+
Title="Extract Compressed Archive"
10+
PrimaryButtonText="Extract"
11+
CloseButtonText="Cancel"
12+
DefaultButton="Primary"
13+
PrimaryButtonClick="ContentDialog_PrimaryButtonClick"
14+
CloseButtonClick="ContentDialog_CloseButtonClick">
15+
16+
<Grid MinWidth="375">
17+
<StackPanel Orientation="Vertical">
18+
<TextBlock TextWrapping="WrapWholeWords" Text="Pick a location to extract this compressed archive to. You'll need to stay in the current folder until we're done. A new tab will open up with the extracted items."/>
19+
<Grid ColumnSpacing="5" Margin="0,14,0,0" >
20+
<Grid.ColumnDefinitions>
21+
<ColumnDefinition Width="75*"/>
22+
<ColumnDefinition Width="25*"/>
23+
</Grid.ColumnDefinitions>
24+
<TextBox x:Name="DestPathText" Grid.Column="0"/>
25+
<Button x:Name="BrowseButton" Grid.Column="1" Content="Browse" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Click="BrowseButton_Click"/>
26+
</Grid>
27+
</StackPanel>
28+
</Grid>
29+
</ContentDialog>
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Runtime.InteropServices.WindowsRuntime;
6+
using Windows.Foundation;
7+
using Windows.Foundation.Collections;
8+
using Windows.UI.Xaml;
9+
using Windows.UI.Xaml.Controls;
10+
using Windows.UI.Xaml.Controls.Primitives;
11+
using Windows.UI.Xaml.Data;
12+
using Windows.UI.Xaml.Input;
13+
using Windows.UI.Xaml.Media;
14+
using Windows.UI.Xaml.Navigation;
15+
16+
// The Content Dialog item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238
17+
18+
namespace Files.Dialogs
19+
{
20+
public sealed partial class ExtractFilesDialog : ContentDialog
21+
{
22+
public ExtractFilesDialog(string currentDirectory)
23+
{
24+
this.InitializeComponent();
25+
DestPathText.Text = currentDirectory;
26+
Windows.Storage.ApplicationData.Current.LocalSettings.Values["Extract_Destination_Path"] = currentDirectory;
27+
}
28+
29+
private void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
30+
{
31+
Windows.Storage.ApplicationData.Current.LocalSettings.Values["Extract_Destination_Cancelled"] = false;
32+
}
33+
34+
35+
36+
private async void BrowseButton_Click(object sender, RoutedEventArgs e)
37+
{
38+
Windows.Storage.Pickers.FolderPicker folderPicker = new Windows.Storage.Pickers.FolderPicker();
39+
folderPicker.CommitButtonText = "Select Folder";
40+
folderPicker.FileTypeFilter.Add("*");
41+
var selectedFolder = await folderPicker.PickSingleFolderAsync();
42+
if(selectedFolder != null)
43+
{
44+
DestPathText.Text = selectedFolder.Path;
45+
Windows.Storage.ApplicationData.Current.LocalSettings.Values["Extract_Destination_Path"] = selectedFolder.Path;
46+
}
47+
}
48+
49+
private void ContentDialog_CloseButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
50+
{
51+
Windows.Storage.ApplicationData.Current.LocalSettings.Values["Extract_Destination_Cancelled"] = true;
52+
}
53+
}
54+
}

Files UWP/FilesUWP.csproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@
131131
<Compile Include="Dialogs\ExceptionDialog.xaml.cs">
132132
<DependentUpon>ExceptionDialog.xaml</DependentUpon>
133133
</Compile>
134+
<Compile Include="Dialogs\ExtractFilesDialog.xaml.cs">
135+
<DependentUpon>ExtractFilesDialog.xaml</DependentUpon>
136+
</Compile>
134137
<Compile Include="Dialogs\LayoutDialog.xaml.cs">
135138
<DependentUpon>LayoutDialog.xaml</DependentUpon>
136139
</Compile>
@@ -224,6 +227,10 @@
224227
<SubType>Designer</SubType>
225228
<Generator>MSBuild:Compile</Generator>
226229
</Page>
230+
<Page Include="Dialogs\ExtractFilesDialog.xaml">
231+
<SubType>Designer</SubType>
232+
<Generator>MSBuild:Compile</Generator>
233+
</Page>
227234
<Page Include="Dialogs\LayoutDialog.xaml">
228235
<SubType>Designer</SubType>
229236
<Generator>MSBuild:Compile</Generator>

Files UWP/GenericFileBrowser.xaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,11 @@
231231
<Setter Property="ContextFlyout">
232232
<Setter.Value>
233233
<MenuFlyout Opened="RightClickContextMenu_Opened" x:Name="RightClickContextMenu" MenuFlyoutPresenterStyle="{StaticResource MenuFlyoutFluentThemeResources}">
234+
<MenuFlyoutItem Text="Extract" x:Name="UnzipItem">
235+
<MenuFlyoutItem.Icon>
236+
<FontIcon Glyph="&#xED25;"/>
237+
</MenuFlyoutItem.Icon>
238+
</MenuFlyoutItem>
234239
<MenuFlyoutItem Text="Open with..." x:Name="OpenItem">
235240
<MenuFlyoutItem.Icon>
236241
<FontIcon Glyph="&#xE7AC;"/>

Files UWP/GenericFileBrowser.xaml.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public GenericFileBrowser()
7575
NewFolder.Click += tabInstance.instanceInteraction.NewFolder_Click;
7676
NewBitmapImage.Click += tabInstance.instanceInteraction.NewBitmapImage_Click;
7777
NewTextDocument.Click += tabInstance.instanceInteraction.NewTextDocument_Click;
78+
UnzipItem.Click += tabInstance.instanceInteraction.ExtractItems_Click;
7879
PropertiesItem.Click += tabInstance.ShowPropertiesButton_Click;
7980
OpenInNewWindowItem.Click += tabInstance.instanceInteraction.OpenInNewWindowItem_Click;
8081
}
@@ -320,13 +321,22 @@ private void RightClickContextMenu_Opened(object sender, object e)
320321
SidebarPinItem.Visibility = Visibility.Collapsed;
321322
OpenInNewTab.Visibility = Visibility.Collapsed;
322323
OpenInNewWindowItem.Visibility = Visibility.Collapsed;
324+
if (selectedDataItem.DotFileExtension.Equals(".zip", StringComparison.OrdinalIgnoreCase))
325+
{
326+
UnzipItem.Visibility = Visibility.Visible;
327+
}
328+
else if (!selectedDataItem.DotFileExtension.Equals(".zip", StringComparison.OrdinalIgnoreCase))
329+
{
330+
UnzipItem.Visibility = Visibility.Collapsed;
331+
}
323332
}
324333
else if (selectedDataItem.FileType == "Folder")
325334
{
326335
SidebarPinItem.Visibility = Visibility.Visible;
327336
OpenInNewTab.Visibility = Visibility.Visible;
328337
OpenInNewWindowItem.Visibility = Visibility.Visible;
329338
}
339+
330340
}
331341

332342
}

Files UWP/Interacts/Interaction.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
using System.IO;
2424
using System.Reflection;
2525
using Files.Dialogs;
26+
using System.IO.Compression;
2627

2728
namespace Files.Interacts
2829
{
@@ -1227,6 +1228,72 @@ public void NewBitmapImage_Click(object sender, RoutedEventArgs e)
12271228
AddItem.CreateFile(tabInstance, "Bitmap Image");
12281229
}
12291230

1231+
public async void ExtractItems_Click(object sender, RoutedEventArgs e)
1232+
{
1233+
StorageFile selectedItem = null;
1234+
if (tabInstance.accessibleContentFrame.CurrentSourcePageType == typeof(GenericFileBrowser))
1235+
{
1236+
var page = (tabInstance.accessibleContentFrame.Content as GenericFileBrowser);
1237+
selectedItem = await StorageFile.GetFileFromPathAsync(tabInstance.instanceViewModel.FilesAndFolders[page.data.SelectedIndex].FilePath);
1238+
1239+
}
1240+
else if (tabInstance.accessibleContentFrame.CurrentSourcePageType == typeof(PhotoAlbum))
1241+
{
1242+
var page = (tabInstance.accessibleContentFrame.Content as PhotoAlbum);
1243+
selectedItem = await StorageFile.GetFileFromPathAsync(tabInstance.instanceViewModel.FilesAndFolders[page.gv.SelectedIndex].FilePath);
1244+
}
1245+
string destinationPath = null;
1246+
ExtractFilesDialog extractFilesDialog = new ExtractFilesDialog(tabInstance.instanceViewModel.Universal.path);
1247+
await extractFilesDialog.ShowAsync();
1248+
if (((bool)ApplicationData.Current.LocalSettings.Values["Extract_Destination_Cancelled"]) == false)
1249+
{
1250+
var bufferItem = await selectedItem.CopyAsync(ApplicationData.Current.TemporaryFolder, selectedItem.DisplayName, NameCollisionOption.ReplaceExisting);
1251+
destinationPath = ApplicationData.Current.LocalSettings.Values["Extract_Destination_Path"].ToString();
1252+
//ZipFile.ExtractToDirectory(selectedItem.Path, destinationPath, );
1253+
var destFolder_InBuffer = await ApplicationData.Current.TemporaryFolder.CreateFolderAsync(selectedItem.DisplayName + "_Extracted", CreationCollisionOption.ReplaceExisting);
1254+
using(FileStream fs = new FileStream(bufferItem.Path, FileMode.Open))
1255+
{
1256+
ZipArchive zipArchive = new ZipArchive(fs);
1257+
int totalCount = zipArchive.Entries.Count;
1258+
int index = 0;
1259+
if (App.selectedTabInstance.accessibleContentFrame.SourcePageType == typeof(GenericFileBrowser))
1260+
{
1261+
(App.selectedTabInstance.accessibleContentFrame.Content as GenericFileBrowser).progressBar.Visibility = Visibility.Visible;
1262+
}
1263+
else if (App.selectedTabInstance.accessibleContentFrame.SourcePageType == typeof(PhotoAlbum))
1264+
{
1265+
(App.selectedTabInstance.accessibleContentFrame.Content as PhotoAlbum).progressBar.Visibility = Visibility.Visible;
1266+
}
1267+
1268+
foreach (ZipArchiveEntry archiveEntry in zipArchive.Entries)
1269+
{
1270+
archiveEntry.ExtractToFile(destFolder_InBuffer.Path + "\\" + archiveEntry.Name);
1271+
index++;
1272+
if (index == totalCount)
1273+
{
1274+
if (App.selectedTabInstance.accessibleContentFrame.SourcePageType == typeof(GenericFileBrowser))
1275+
{
1276+
(App.selectedTabInstance.accessibleContentFrame.Content as GenericFileBrowser).progressBar.Visibility = Visibility.Collapsed;
1277+
}
1278+
else if (App.selectedTabInstance.accessibleContentFrame.SourcePageType == typeof(PhotoAlbum))
1279+
{
1280+
(App.selectedTabInstance.accessibleContentFrame.Content as PhotoAlbum).progressBar.Visibility = Visibility.Collapsed;
1281+
}
1282+
}
1283+
}
1284+
CloneDirectoryAsync(destFolder_InBuffer.Path, destinationPath, destFolder_InBuffer.Name);
1285+
await destFolder_InBuffer.DeleteAsync(StorageDeleteOption.PermanentDelete);
1286+
Frame rootFrame = Window.Current.Content as Frame;
1287+
var instanceTabsView = rootFrame.Content as InstanceTabsView;
1288+
instanceTabsView.AddNewTab(typeof(ProHome), destinationPath + "\\" + selectedItem.DisplayName);
1289+
}
1290+
}
1291+
else if (((bool)ApplicationData.Current.LocalSettings.Values["Extract_Destination_Cancelled"]) == true)
1292+
{
1293+
return;
1294+
}
1295+
}
1296+
12301297
public void SelectAllItems()
12311298
{
12321299
if(App.selectedTabInstance.accessibleContentFrame.SourcePageType == typeof(GenericFileBrowser))

Files UWP/PhotoAlbum.xaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,11 @@
436436
<Setter.Value>
437437
<MenuFlyout Opened="RightClickContextMenu_Opened" x:Name="RightClickContextMenu" MenuFlyoutPresenterStyle="{StaticResource MenuFlyoutFluentThemeResources}">
438438
<MenuFlyout.Items>
439+
<MenuFlyoutItem Text="Extract" x:Name="UnzipItem">
440+
<MenuFlyoutItem.Icon>
441+
<FontIcon Glyph="&#xED25;"/>
442+
</MenuFlyoutItem.Icon>
443+
</MenuFlyoutItem>
439444
<MenuFlyoutItem Click="OpenItem_Click" Text="Open With..." Name="OpenItem">
440445
<MenuFlyoutItem.Icon>
441446
<FontIcon Glyph="&#xE7AC;"/>

Files UWP/PhotoAlbum.xaml.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ public PhotoAlbum()
6565
NewFolder.Click += tabInstance.instanceInteraction.NewFolder_Click;
6666
NewBitmapImage.Click += tabInstance.instanceInteraction.NewBitmapImage_Click;
6767
NewTextDocument.Click += tabInstance.instanceInteraction.NewTextDocument_Click;
68+
UnzipItem.Click += tabInstance.instanceInteraction.ExtractItems_Click;
69+
6870
}
6971

7072
protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
@@ -308,6 +310,14 @@ private void RightClickContextMenu_Opened(object sender, object e)
308310
OpenInNewTab.Visibility = Visibility.Visible;
309311
OpenInNewWindowItem.Visibility = Visibility.Visible;
310312
}
313+
else if (selectedDataItem.DotFileExtension.Equals(".zip", StringComparison.OrdinalIgnoreCase))
314+
{
315+
UnzipItem.Visibility = Visibility.Visible;
316+
}
317+
else if (!selectedDataItem.DotFileExtension.Equals(".zip", StringComparison.OrdinalIgnoreCase))
318+
{
319+
UnzipItem.Visibility = Visibility.Collapsed;
320+
}
311321
}
312322
}
313323
}

0 commit comments

Comments
 (0)