zoukankan      html  css  js  c++  java
  • 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);

                  }

            }

  • 相关阅读:
    总结
    webview细节注意
    对图片的处理
    介绍并提高app中WebView的性能
    工作中新接触的问题
    iOS环信
    Framework静态库制作方法
    多线程GCD
    iOS开发之地图与定位
    ARC内存管理机制详解
  • 原文地址:https://www.cnblogs.com/akwwl/p/2837550.html
Copyright © 2011-2022 走看看