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);

                  }

            }

  • 相关阅读:
    New version of VS2005 extensions for SharePoint 3.0
    QuickPart : 用户控件包装器 for SharePoint Server 2007
    随想
    发布 SharePoint Server 2007 Starter Page
    如何在SharePoint Server中整合其他应用系统?
    Office SharePoint Server 2007 中文180天评估版到货!
    RMS 1.0 SP2
    SharePoint Server 2007 Web内容管理中的几个关键概念
    如何为已存在的SharePoint站点启用SSL
    Some update information about Office 2007
  • 原文地址:https://www.cnblogs.com/akwwl/p/2837550.html
Copyright © 2011-2022 走看看