none
c#开发metro 文件zip解压缩 RRS feed

  • 问题

  • 请教版主, 现在有个需求,需要把多个文件 打包在一个zip压缩包里 xxx.zip这样。。。另外还需要解压,xxx.zip压缩包解压出来多个文件。metro例子代码里只有把一个文件压缩的,没有多个文件的。
    • 已编辑 zjp429 2012年7月27日 4:16
    2012年7月27日 4:16

答案

  • 我这个例子,是一个完整的Metro解压缩ZIP文件的例子,并且可以自选保存目录。

            private async void Button_Click_1(object sender, RoutedEventArgs e)
            {
                FileOpenPicker fop = new FileOpenPicker();
                fop.FileTypeFilter.Add(".zip");
                fop.SuggestedStartLocation = PickerLocationId.Desktop;
                fop.ViewMode = PickerViewMode.List;
                var zipfile = await fop.PickSingleFileAsync();
                byte[] buffer = WindowsRuntimeBufferExtensions.ToArray(await FileIO.ReadBufferAsync(zipfile));
                using (MemoryStream stream = new MemoryStream(buffer))
                {
                    ZipArchive zipArchive = new ZipArchive(stream, ZipArchiveMode.Read);
                    FolderPicker fp = new FolderPicker();
                    //Add file types to the FolderPicker
                    foreach (var zipArchiveEntry in zipArchive.Entries)
                    {
                        if (!zipArchiveEntry.FullName.EndsWith("/"))
                        {
                            string fileExtension = "." + Regex.Match(zipArchiveEntry.FullName, @"[^\.]\w+$").Value;
                            if (!fp.FileTypeFilter.Contains(fileExtension))
                                fp.FileTypeFilter.Add(fileExtension);
                        }
                    }
                    fp.SuggestedStartLocation = PickerLocationId.Desktop;
                    fp.ViewMode = PickerViewMode.List;
                    StorageFolder unzipfolder = await fp.PickSingleFolderAsync();
                    int progress = 0;
                    foreach (var zipArchiveEntry in zipArchive.Entries)
                    {
                        if (!String.IsNullOrEmpty(zipArchiveEntry.FullName))
                        {
                            if (!zipArchiveEntry.FullName.EndsWith("/"))
                            {
                                string fileName = zipArchiveEntry.FullName.Replace("/", "\\");
                                using (Stream fileData = zipArchiveEntry.Open())
                                {
                                    StorageFile newFile = await unzipfolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
                                    using (IRandomAccessStream newFileStream = await newFile.OpenAsync(FileAccessMode.ReadWrite))
                                    {
                                        using (Stream s = newFileStream.AsStreamForWrite())
                                        {
                                            await fileData.CopyToAsync(s);
                                            await s.FlushAsync();
                                        }
                                    }
                                }
                            }
                        }
                        progress++;
                        progressBar.Value = progress * 100 / zipArchive.Entries.Count;
                    }
                }
            }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月27日 8:53
    版主

全部回复

  • 我这个例子,是一个完整的Metro解压缩ZIP文件的例子,并且可以自选保存目录。

            private async void Button_Click_1(object sender, RoutedEventArgs e)
            {
                FileOpenPicker fop = new FileOpenPicker();
                fop.FileTypeFilter.Add(".zip");
                fop.SuggestedStartLocation = PickerLocationId.Desktop;
                fop.ViewMode = PickerViewMode.List;
                var zipfile = await fop.PickSingleFileAsync();
                byte[] buffer = WindowsRuntimeBufferExtensions.ToArray(await FileIO.ReadBufferAsync(zipfile));
                using (MemoryStream stream = new MemoryStream(buffer))
                {
                    ZipArchive zipArchive = new ZipArchive(stream, ZipArchiveMode.Read);
                    FolderPicker fp = new FolderPicker();
                    //Add file types to the FolderPicker
                    foreach (var zipArchiveEntry in zipArchive.Entries)
                    {
                        if (!zipArchiveEntry.FullName.EndsWith("/"))
                        {
                            string fileExtension = "." + Regex.Match(zipArchiveEntry.FullName, @"[^\.]\w+$").Value;
                            if (!fp.FileTypeFilter.Contains(fileExtension))
                                fp.FileTypeFilter.Add(fileExtension);
                        }
                    }
                    fp.SuggestedStartLocation = PickerLocationId.Desktop;
                    fp.ViewMode = PickerViewMode.List;
                    StorageFolder unzipfolder = await fp.PickSingleFolderAsync();
                    int progress = 0;
                    foreach (var zipArchiveEntry in zipArchive.Entries)
                    {
                        if (!String.IsNullOrEmpty(zipArchiveEntry.FullName))
                        {
                            if (!zipArchiveEntry.FullName.EndsWith("/"))
                            {
                                string fileName = zipArchiveEntry.FullName.Replace("/", "\\");
                                using (Stream fileData = zipArchiveEntry.Open())
                                {
                                    StorageFile newFile = await unzipfolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
                                    using (IRandomAccessStream newFileStream = await newFile.OpenAsync(FileAccessMode.ReadWrite))
                                    {
                                        using (Stream s = newFileStream.AsStreamForWrite())
                                        {
                                            await fileData.CopyToAsync(s);
                                            await s.FlushAsync();
                                        }
                                    }
                                }
                            }
                        }
                        progress++;
                        progressBar.Value = progress * 100 / zipArchive.Entries.Count;
                    }
                }
            }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月27日 8:53
    版主
  • 可以解压zip  那rar 格式是否可以呢???

    能否提供一下 zip, 压缩的代码呢。 谢谢

    2012年8月6日 15:07
  • 据我所知 ,没有支持rar的 Metro的库。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月7日 4:01
    版主
  • 2012年8月7日 5:17
    版主
  • 你好,我是一个windows 开发新手,我想问下。如何将从界面选取变为直接在代码中给定一个zip压缩包的链接的,还有下面选择保存如何用代码直接保存到当前程序运行的目录下面了。

    谢谢!

    2013年3月21日 9:16
  • 应用在我们设定了权限后,仅可以默认访问 系统库中的文件, 应用数据目录下的文件, 移动设备上的文件和只读模式访问应用安装目录下的文件.

    如果要其它位置的文件,必须通过FilePicker 来让用户选取。所以你不能直接给一个其它位置的连接让应用读取。

    应用对于他自己的运行目录只有只读权限,我建议你将你的数据保存到 ApplicationData 的 LocalFolder 或者 RoamingFolder下,这个目录 在你的 系统 C:\Users\[your name]\AppData\Local\Packages\[your app family name]  注意,AppData默认是隐藏目录。


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    • 已建议为答案 09soft 2013年3月22日 2:14
    2013年3月22日 1:48
    版主
  • 我已经用了你上面的建议了,确实我在应用安装的目录下建立文件夹显示无法访问,文件都显示只读属性。

    谢谢!

    • 已建议为答案 09soft 2013年3月22日 2:14
    • 取消建议作为答案 09soft 2013年3月22日 2:14
    2013年3月22日 2:14