设为首页 收藏本站
查看: 1155|回复: 0

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

[复制链接]

尚未签到

发表于 2015-5-22 13:30:20 | 显示全部楼层 |阅读模式
  在Windows  8开发中另外一个非常好的工具:文件选择器。可以从用户机器上获取一个或者多个文件。最后我也会介绍一下如何在用户机器上选择一个文件夹。
  
  1.  更新package.appxmanifest,我们与用户系统进行交互的所有机制,首先都需要更新package.appxmanifest文件。在本文,我们要进行文件的打开和保存,所以所以需要添加相应的声明。
  1)针对文件打开选择器,需要添加如下内容:
DSC0000.jpg
  
      如上图,有两个选择:
    支持任何文件类型:选择这个的话,你的程序就被声明为可以访问任意类型的文件。
    支持文件类型:在这里指定你想要打开的文件类型,例如你只想让程序打开Excel文件,那么可以在这里输入“.xls”。
  2)文件保存选择器的设置也是类似的。如下图:
  
DSC0001.jpg
  
  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 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() { ".jpg",".jpeg",".png",".bmp",".gif"});
  picker.FileTypeChoices.Add("Text", newList() { ".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);
  }
  }
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-69608-1-1.html 上篇帖子: Windows 8 开发之设置合约 下篇帖子: 从零开始,学习windows编程(8)--自己动手,编译CRT
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表