Windows 8 文件选择器(FileOpenPicker,FileSavePicker,FolderPicker)

  在Windows  8开发中另外一个非常好的工具:文件选择器。可以从用户机器上获取一个或者多个文件。最后我也会介绍一下如何在用户机器上选择一个文件夹。
  

     1.  更新package.appxmanifest,我们与用户系统进行交互的所有机制,首先都需要更新package.appxmanifest文件。在本文,我们要进行文件的打开和保存,所以所以需要添加相应的声明。

     1)针对文件打开选择器,需要添加如下内容:

  
      如上图,有两个选择:
    支持任何文件类型:选择这个的话,你的程序就被声明为可以访问任意类型的文件。
    支持文件类型:在这里指定你想要打开的文件类型,例如你只想让程序打开Excel文件,那么可以在这里输入“.xls”。 
  2)文件保存选择器的设置也是类似的。如下图:

  


  2.  从用户机器上获取一个文件

  1)选择一个或者多个文件(FileOpenPicker)
  本文创建从用户机器上选择文件,首先是选择一个文件,然后是多个文件,接着是选择指定某种文件类型(如.png)的多个文件。从用户机器上选择一个文件,需要从FileOpenPicker对象开始。这个对象会给用户打开一个文件打开选择器对话框,帮助用户选择一个或者多个文件,然后返回给我们。它有许多选项,我这里会进行介绍。下面是选择指定文件类型的一个文件的相关代码:  

   private async void Button_Click(object sender, RoutedEventArgs e)

        {

      FileOpenPicker picker = newFileOpenPicker();

              picker.ViewMode =PickerViewMode.Thumbnail;  //设置文件的现实方式,这里选择的是图标

              picker.SuggestedStartLocation =PickerLocationId.PicturesLibrary; //设置打开时的默认路径,这里选择的是图片库

              picker.FileTypeFilter.Add(".jpg");                 //添加可选择的文件类型,这个必须要设置

                picker.FileTypeFilter.Add(".jpeg");

                picker.FileTypeFilter.Add(".png");

       IReadOnlyList<StorageFile> files =await picker.PickMultipleFilesAsync();  //选择打开多个文件

      

      // StorageFile file = await picker.PickSingleFileAsync();    //只能选择一个文件

 

      if (files != null && files.Count > 0)

             {          

        foreach(var file in files)

                  {

           ..........

                        //对选择的文件进行相关处理

                  }

             }

        }

    创建FileOpenPicker时,我们必须设置FileTypeFilter。不允许 提供一个通配符或者忽略该过滤器。你必须提供至少一个文件类型,也可以提供 多个(比如在选择图片是,可能会有PNG、JPG、JPEG、GIF和BMP等),当用户选择了一个文件后,它将给我们的程 序返回一个StorageFile。 在打开文件打开选择器的时候,预先指 定一个路径,比如图片集合、或音乐,我们可以指定如下用户电脑中8个位置里 的一个。最后,我们还可以设置文件打开选择器中如何显示文件。使用FileOpenPicker 对象的ViewMode属性即可,如下: picker.ViewMode = PickerViewMode.List;    可选项只有List或Thumbnail,它们显示出来的样子不太一样。Thumbnail只 显示一个方形图片,代表一个文件。

  2).保存选中的文件到另一个地方(FileSavePicker)

  接下来,我们看看如何使用文件选择器,将文件保存到用户机器中。 与上面操作相关的一个功能,可能就是我们希望能够将一个文件保存到用户机器中。这与将文件保存在程序内部是不同的。在这里,我们是将文件永久的保存在用户机器中,即使我们的程序被卸载了,保存的文件还存在。如果别的程序不能使用你的文件,这可能不是你想要的一种存储方法。我建议这种方式存储的文件一般可以被许多其它程序打开。要实现这样的文件保存功能,与FileOpenPicker非常类似,只不过使用的是FileSavePicker。 另外一个不同点就是我们将数据写到用户的硬盘中。这也就会带来一些其它问题,比如文件已经被打开,并被其它程序编辑,甚至删除该文件。所以,我们首先需要启动文件保存选择器,让用户决定将文件保存在什么地方(同时还有文件类型和文件名),代码如下:  

  private async void Save_Click(object sender, RoutedEventArgs e)

        {

       FileSavePicker picker = newFileSavePicker();

              picker.SuggestedStartLocation =PickerLocationId.Desktop;

              picker.FileTypeChoices.Add("Image", newList<string>() { ".jpg",".jpeg",".png",".bmp",".gif"});

              picker.FileTypeChoices.Add("Text", newList<string>() { ".txt"});

              picker.SuggestedFileName =DateTime.Now.ToString("yyyyMMddhhmmss");

         StorageFile file =await picker.PickSaveFileAsync();         

          if (file != null)

             {

          CachedFileManager.DeferUpdates(file);             

       IBuffer buffer = awaitFileIO.ReadBufferAsync(storageFile);           //storageFile是已经选中要保存的文件

        await FileIO.WriteBufferAsync(file,buffer);             

        FileUpdateStatus status = awaitCachedFileManager.CompleteUpdatesAsync(file);

            }

        }

  在上面代码中,开始的地方看起来就有点与之前的不同了。不再使用过滤器,而是添加相应的FileTypeChoices,代表用户可以存储的不同文件格式。我选择的
这些choice有点不太相关,不过这可以帮助演示在列表中显示指定的任意文件类型。这些都是由你来控制的。另外,当用户选择了一个位置和对应文件的name后,还没有完。实际上,选择器会将这些值返回给我们,下一步就是利用这些值将数据写入到对应的文件中。在我的if语句中,我使用DeferUpdates()方法来保护正在使用的这个文件不别的程序操作,直到我的操作完成。最后,使用CompleteUpdateAsync()方法来提交这些保存的数据,这就意味着所有的工作都完成。

  

  3).选中一个文件夹(FolderPicker)     

  从用户机器上选择一个文件夹,而不是一个指定的文件。让用户来选择一个默认的存储位置,或者选择一个你查找文件的位置。这种处理的一个好处就是当用户选择一个文件夹后,我们可以将该文件夹保存为我们的默认文件夹,并且获得确定的授权:在不需要进行请求访问下,对该文件夹进行读写。下面是相关代码: 

   private async void Delete_Click(object sender, RoutedEventArgs e)

        {          

      FolderPicker folder = newFolderPicker();

       folder.ViewMode =PickerViewMode.Thumbnail;

              folder.SuggestedStartLocation =PickerLocationId.DocumentsLibrary;

              folder.FileTypeFilter.Add(".jpeg");

        StorageFolder storageFolder = await folder.PickSingleFolderAsync();

         if (folder != null)

             {

       //对文件夹内的文件进行相关处理

       .......

         StorageApplicationPermissions.FutureAccessList.AddOrReplace("DefaultFolder", storageFolder);

              }

        }

 

posted @ 2013-01-04 18:36  @大龙哥  阅读(3582)  评论(0编辑  收藏  举报