Zip for UWP
複数のファイルおよびフォルダの zip 圧縮
タスク別ヘルプ > 複数のファイルおよびフォルダの zip 圧縮

C1ZipEntryCollection の AddFolderAsync メソッドを使用して、複数のファイルやフォルダを簡単に zip 圧縮することができます。複数のファイルやフォルダを選択し、それらすべてをまとめて圧縮するには、次のコードを使用します。このコード例では、以下のボタンクリックイベントを定義しています。

次の手順を実行します。

  1. MainPage.xaml ファイルを開き、開始タグ <Page> を見つけます。このタグには、必要な名前空間が含まれています。次のマークアップになるように、タグを編集します。
    C#
    コードのコピー
    <Page
        x:Class="ZipUWP.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:ZipUWP"
        xmlns:flexGrid="using:C1.Xaml.FlexGrid"
        xmlns:c1="using:C1.Xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
  2. 複数のファイルやフォルダを選択し、それらを 1 つの zip ファイルに圧縮し、最後にそれらを抽出するには、次のコードを追加します。
    C#
    コードのコピー
        <Page.Resources>
            <ResourceDictionary>
                <ResourceDictionary.ThemeDictionaries>
                    <ResourceDictionary x:Key="Default">
                        <SolidColorBrush x:Key="ApplicationPageBackgroundThemeBrush" Color="#FF1D1D1D"/>
                    </ResourceDictionary>
                    <ResourceDictionary x:Key="Light">
                        <SolidColorBrush x:Key="ApplicationPageBackgroundThemeBrush" Color="#FFF2F2F2"/>
                    </ResourceDictionary>
                </ResourceDictionary.ThemeDictionaries>
                <Style x:Key="bigButton" TargetType="Button" >
                    <Setter Property="Width" Value="124" />
                    <Setter Property="FontSize"  Value="16" />
                    <Setter Property="Margin" Value="10,0,0,0" />
                    <Setter Property="Padding" Value="2" />
                </Style>
                <Style x:Key="smallButton" TargetType="Button" >
                    <Setter Property="Width" Value="100" />
                    <Setter Property="FontSize" Value="14" />
                    <Setter Property="Margin" Value="4,0,0,0" />
                    <Setter Property="Padding" Value="0" />
                </Style>
            </ResourceDictionary>
        </Page.Resources>
        <Grid>
            <Grid x:Name="_mainpage">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <RelativePanel Grid.Row="0">
                    <RelativePanel Name="_compressPanel" >
                        <TextBlock Name="_compress" Text="compress" FontSize="16" Width="100"/>
                        <Button Name="_btnPickSingleFolder" Content="PickSingleFolder" Click="_btnPickFolder_Click"/>
                        <Button Name="_btnPickFiles" Content="PickFiles" RelativePanel.RightOf="_btnPickSingleFolder" RelativePanel.AlignTopWith="_btnPickSingleFolder" Click="_btnPickFiles_Click"/>
                        <Button Name="_btnCompress" Content="Compress" RelativePanel.RightOf="_btnPickFiles" RelativePanel.AlignTopWith="_btnPickSingleFolder" Click="_btnCompress_Click" IsEnabled="False" Height="51" Margin="4,0,-36,-47" Width="136"/>
                    </RelativePanel>
                    <RelativePanel Name="_extractPanel"  >
                        <TextBlock Name="_extract" Text="extract" FontSize="16" Width="100"/>
                        <Button Name="_btnOpen" Content="Open" Click="_btnOpen_Click" />
                        <Button Name="_btnExtract" Content="Extract" RelativePanel.RightOf="_btnOpen" RelativePanel.AlignTopWith="_btnOpen" Click="_btnExtract_Click" IsEnabled="False"/>
                    </RelativePanel>
                    <RelativePanel Name="_actionPanel" >
                        <Button Name="_btnRemove" Content="Remove" Click="_btnRemove_Click" IsEnabled="False" />
                        <Button Name="_btnView" Content="View" Click="_btnView_Click" IsEnabled="False"/>
                        <Button Name="_btnClear" Content="Clear" Click="_btnClear_Click" />
               
                        <ListBox Name="listBox1" />
                    </RelativePanel>
                </RelativePanel>
                <ProgressBar x:Name="progressBar" Grid.Row="1" Width="400" Canvas.ZIndex="10" HorizontalAlignment="Center" VerticalAlignment="Center" IsIndeterminate="True" Visibility="Collapsed" Background="Black"/>
                <flexGrid:C1FlexGrid BorderBrush="Gray" BorderThickness="1" Margin="4"
                                x:Name="_flex" Grid.Row="2"
                                SelectionMode="Row"
                                HeadersVisibility="Column"
                                AllowResizing="Columns"
                                HeaderGridLinesBrush="Transparent"
                                AutoGenerateColumns="False" >
                    <flexGrid:C1FlexGrid.Columns>
                        <flexGrid:Column Binding="{Binding FileName}" Header="Name" /> <!--x:Uid="/ZipSamplesLib/Resources/Name"-->
                        <flexGrid:Column Binding="{Binding SizeUncompressedLong}" Header="Size" Format="n0" /> <!--x:Uid="/ZipSamplesLib/Resources/Size"-->
                        <flexGrid:Column Binding="{Binding SizeCompressedLong}" Header="Compressed" Format="n0" /> <!--x:Uid="/ZipSamplesLib/Resources/Compressed"-->
                        <flexGrid:Column Binding="{Binding CompressionRatio}" Header="Ratio" Format="p0" /> <!--x:Uid="/ZipSamplesLib/Resources/Ratio"-->
                        <flexGrid:Column Binding="{Binding CRC32}" Header="Crc" Format="x0" /> <!--x:Uid="/ZipSamplesLib/Resources/CRC"-->
                        <flexGrid:Column Binding="{Binding Attributes}" Header="Attributes" /> <!--x:Uid="/ZipSamplesLib/Resources/Attributes"-->
                    </flexGrid:C1FlexGrid.Columns>
                </flexGrid:C1FlexGrid>
            </Grid>
            <RelativePanel Name="_preview" Visibility="Collapsed">
                <TextBlock Name="_text" Text="text" FontSize="28" Margin="0 0 40 0"/>
                <Button  Name="_btnClosePreview" Content="ClosePreview" Click="_btnClosePreview_Click_1" RelativePanel.RightOf="_text" Margin="30,0,40,0" Width="100"/>
                <TextBox Name="_tbContent" IsReadOnly="True" AcceptsReturn="True" FontFamily="Courier New" Background="White" RelativePanel.Below="_btnClosePreview" Margin="10"/>
            </RelativePanel>
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="WindowSizeStates">
    
                    <VisualState>
                        <VisualState.StateTriggers>
    
                            <AdaptiveTrigger MinWindowWidth="481" />
                        </VisualState.StateTriggers>
                        <VisualState.Setters>
                            <!-- Simplified Setter statements are used to move elements around to optimize for more available space -->
                            <Setter Target="_btnPickSingleFolder.(RelativePanel.RightOf)" Value="_compress" />
                            <Setter Target="_btnPickSingleFolder.Style" Value="{StaticResource bigButton}" />
                            <Setter Target="_btnPickFiles.(RelativePanel.RightOf)" Value="_btnPickSingleFolder" />
                            <Setter Target="_btnPickFiles.Style" Value="{StaticResource bigButton}" />
                            <Setter Target="_btnCompress.(RelativePanel.RightOf)" Value="_btnPickFiles" />
                            <Setter Target="_btnCompress.Style" Value="{StaticResource bigButton}" />
                            <Setter Target="_extractPanel.(RelativePanel.Below)" Value="_compressPanel" />
                            <Setter Target="_extractPanel.Margin" Value="0,10,0,0" />
                            <Setter Target="_btnOpen.(RelativePanel.RightOf)" Value="_extract" />
                            <Setter Target="_btnOpen.Style" Value="{StaticResource bigButton}" />
                            <Setter Target="_btnExtract.Style" Value="{StaticResource bigButton}" />
                            <Setter Target="_actionPanel.(RelativePanel.Below)" Value="_extractPanel" />
                            <Setter Target="_actionPanel.Margin" Value="100,10,0,0" />
                            <Setter Target="_btnRemove.Style" Value="{StaticResource bigButton}" />
                            <Setter Target="_btnView.(RelativePanel.RightOf)" Value="_btnRemove" />
                            <Setter Target="_btnView.Style" Value="{StaticResource bigButton}" />
                            <Setter Target="_btnClear.(RelativePanel.RightOf)" Value="_btnView" />
                            <Setter Target="_btnClear.Style" Value="{StaticResource bigButton}" />
                            <Setter Target="_flex.FontSize" Value="16" />
                        </VisualState.Setters>
                    </VisualState>
                    <VisualState>
                        <VisualState.StateTriggers>
    
                            <AdaptiveTrigger MinWindowWidth="0" />
                        </VisualState.StateTriggers>
                        <VisualState.Setters>
                                           
                            <Setter Target="_compress.FontSize" Value="12" />
                            <Setter Target="_extract.FontSize" Value="12" />
                            <Setter Target="_btnPickSingleFolder.(RelativePanel.Below)" Value="_compress" />
                            <Setter Target="_btnPickSingleFolder.Style" Value="{StaticResource smallButton}" />
                            <Setter Target="_btnPickFiles.(RelativePanel.RightOf)" Value="_btnPickSingleFolder" />
                            <Setter Target="_btnPickFiles.Style" Value="{StaticResource smallButton}" />
                            <Setter Target="_btnCompress.(RelativePanel.RightOf)" Value="_btnPickFiles" />
                            <Setter Target="_btnCompress.Style" Value="{StaticResource smallButton}" />
                            <Setter Target="_extractPanel.(RelativePanel.Below)" Value="_compressPanel" />
                            <Setter Target="_extractPanel.Margin" Value="0,10,0,0" />
                            <Setter Target="_btnOpen.(RelativePanel.Below)" Value="_extract" />
                            <Setter Target="_btnOpen.Style" Value="{StaticResource smallButton}" />
                            <Setter Target="_btnExtract.Style" Value="{StaticResource smallButton}" />
                            <Setter Target="_actionPanel.(RelativePanel.Below)" Value="_extractPanel" />
                            <Setter Target="_actionPanel.Margin" Value="0,10,0,0" />
                            <Setter Target="_btnRemove.Style" Value="{StaticResource smallButton}" />
                            <Setter Target="_btnView.(RelativePanel.RightOf)" Value="_btnRemove" />
                            <Setter Target="_btnView.Style" Value="{StaticResource smallButton}" />
                            <Setter Target="_btnClear.(RelativePanel.RightOf)" Value="_btnView" />
                            <Setter Target="_btnClear.Style" Value="{StaticResource smallButton}" />
                            <Setter Target="_flex.FontSize" Value="10" />
                            <Setter Target="_btnClosePreview.Margin" Value="0,0,5,0" />
                            <Setter Target="_btnClosePreview.Width" Value="80" />
                        </VisualState.Setters>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
        </Grid>
    </Page>
    
  3. MainPage.xaml.cs ファイルを開き、以下の名前空間をコードの先頭に追加します。
    C#
    コードのコピー
    using System.IO;
    using C1.C1Zip;
    using Windows.Storage.Pickers;
    using Windows.Storage;
    using Windows.UI.Popups;
    
  4. 次のコードをファイルに追加します。 このコードは、複数のファイルやフォルダを選択し、それらを1つのzip ファイルに圧縮し、最後にそれらを抽出します。
    C#
    コードのコピー
    namespace ZipUWP
    {
        public sealed partial class MainPage : Page
        {
            C1ZipFile _zip;
            CollectionViewSource _cvs = new CollectionViewSource();
            MemoryStream zipMemoryStream = null;
            public MainPage()
            {
                this.InitializeComponent();
                _flex.SelectedItemChanged += _flex_SelectedItemChanged;
                // グリッドを entries コレクションに連結します
            }
            void _flex_SelectedItemChanged(object sender, EventArgs e)
            {
                if (_flex.SelectedItem != null)
                {
                    _btnView.IsEnabled = true;
                    _btnRemove.IsEnabled = true;
                }
                else
                {
                    _btnView.IsEnabled = false;
                    _btnRemove.IsEnabled = false;
                }
            }
            void RefreshView()
            {
                //var sel = _flex.SelectedItem;
                _flex.ItemsSource = null;
                if (_zip == null)
                {
                    return;
                }
                _flex.ItemsSource = _zip.Entries;
                if (_zip.Entries.Count == 0)
                {
                    _btnCompress.IsEnabled = false;
                    _btnRemove.IsEnabled = false;
                    _btnView.IsEnabled = false;
                    _btnExtract.IsEnabled = false;
                }
                //_flex.SelectedItem = sel;
            }
            // 既存の zip ファイルを開きます
            async void _btnOpen_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    var picker = new Windows.Storage.Pickers.FileOpenPicker();
                    picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;
                    picker.FileTypeFilter.Add(".zip");
                    StorageFile _zipfile = await picker.PickSingleFileAsync();
                    if (_zipfile != null)
                    {
                        Clear();
                        progressBar.Visibility = Visibility.Visible;
                        if (_zip == null)
                        {
                            _zip = new C1ZipFile(new System.IO.MemoryStream(), true);
                        }
                        var stream = await _zipfile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
                        _zip.Open(stream.AsStream());
                        _btnExtract.IsEnabled = true;
                        RefreshView();
                    }
                }
                catch (Exception x)
                {
                    System.Diagnostics.Debug.WriteLine(x.Message);
                }
                progressBar.Visibility = Visibility.Collapsed;
            }
            // 選択されたエントリを zip から削除します
            void _btnRemove_Click(object sender, RoutedEventArgs e)
            {
                foreach (C1ZipEntry entry in _flex.SelectedItems)
                {
                    _zip.Entries.Remove(entry.FileName);
                }
                RefreshView();
            }
            // 選択されたエントリのプレビューを表示します
            void _btnView_Click(object sender, RoutedEventArgs e)
            {
                var entry = _flex.SelectedItem as C1ZipEntry;
                if (entry != null)
                {
                    using (var stream = entry.OpenReader())
                    {
                        var sr = new System.IO.StreamReader(stream);
                        _tbContent.Text = sr.ReadToEnd();
                    }
                    _preview.Visibility = Visibility.Visible;
                    _mainpage.Visibility = Visibility.Collapsed;
                }
            }
            // プレビューペインを非表示にして閉じます
            void _btnClosePreview_Click_1(object sender, RoutedEventArgs e)
            {
                _preview.Visibility = Visibility.Collapsed;
                _mainpage.Visibility = Visibility.Visible;
            }
            // フォルダを指定してファイルを追加します
            private async void _btnPickFolder_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    FolderPicker folderPicker = new FolderPicker();
                    folderPicker.FileTypeFilter.Add("*");
                    StorageFolder pickedFolder = await folderPicker.PickSingleFolderAsync();
                    if (pickedFolder != null)
                    {
                        if (_btnExtract.IsEnabled)
                        {
                            Clear();
                        }
                        progressBar.Visibility = Visibility.Visible;
                        if (zipMemoryStream == null)
                        {
                            zipMemoryStream = new MemoryStream();
                        }
                        if (_zip == null)
                        {
                            _zip = new C1ZipFile(zipMemoryStream, true);
                        }
                        await _zip.Entries.AddFolderAsync(pickedFolder);
                        _btnCompress.IsEnabled = true;
                    }
                }
                catch
                {
                }
                RefreshView();
                progressBar.Visibility = Visibility.Collapsed;
            }
            // ファイルを追加します
            private async void _btnPickFiles_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    var picker = new Windows.Storage.Pickers.FileOpenPicker();
                    picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;
                    picker.FileTypeFilter.Add("*");
                    var files = await picker.PickMultipleFilesAsync();
                    if (files != null)
                    {
                        if (files.Count == 0)
                        {
                            return;
                        }
                        if (_btnExtract.IsEnabled)
                        {
                            Clear();
                        }
                        progressBar.Visibility = Visibility.Visible;
                        if (zipMemoryStream == null)
                        {
                            zipMemoryStream = new MemoryStream();
                        }
                        if (_zip == null)
                        {
                            _zip = new C1ZipFile(zipMemoryStream, true);
                        }
                        foreach (var f in files)
                        {
                            await _zip.Entries.AddAsync(f);
                        }
                        _btnCompress.IsEnabled = true;
                    }
                }
                catch
                {
                }
                RefreshView();
                progressBar.Visibility = Visibility.Collapsed;
            }
            private async void _btnCompress_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    if (zipMemoryStream != null)
                    {
                        FileSavePicker fileSavePicker = new FileSavePicker();
                        fileSavePicker.FileTypeChoices.Add("Zip", new List<string> { ".zip" });
                        fileSavePicker.DefaultFileExtension = ".zip";
                        fileSavePicker.SuggestedFileName = "NewFolder";
                        fileSavePicker.CommitButtonText = "Save";
                        fileSavePicker.SuggestedStartLocation = PickerLocationId.ComputerFolder;
                        StorageFile pickedSaveFile = await fileSavePicker.PickSaveFileAsync();
                        await FileIO.WriteBytesAsync(pickedSaveFile, zipMemoryStream.ToArray());
                        MessageDialog md = new MessageDialog("正常に圧縮し、パスは :" + pickedSaveFile.Path);
                        md.ShowAsync();
                    }
                }
                catch
                {
                }
                RefreshView();
            }
            private async void _btnExtract_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    FolderPicker folderPicker = new FolderPicker();
                    folderPicker.FileTypeFilter.Add("*");
                    StorageFolder pickedFolder = await folderPicker.PickSingleFolderAsync();
                    progressBar.Visibility = Visibility.Visible;
                    foreach (var entry in _zip.Entries)
                    {
                        var name = entry.FileName;
                        await entry.Extract(pickedFolder, name);
                    }
                    MessageDialog md = new MessageDialog("正常に抽出し、パスは :" + pickedFolder.Path);
                    md.ShowAsync();
                }
                catch
                {
                }
                RefreshView();
                progressBar.Visibility = Visibility.Collapsed;
            }
            private void _btnClear_Click(object sender, RoutedEventArgs e)
            {
                Clear();
            }
            private void Clear()
            {
                _flex.ItemsSource = null;
                if (zipMemoryStream != null)
                {
                    zipMemoryStream.Flush();
                    zipMemoryStream.Dispose();
                }
                zipMemoryStream = null;
                _btnCompress.IsEnabled = false;
                _btnExtract.IsEnabled = false;
                if (_zip != null)
                {
                    _zip.Close();
                    _zip = null;
                }
            }       
        }
    }
    

上のコードには、zip ファイルに空のフォルダを追加できないという制限があることに注意してください。