Win10的开发经常需要进行文件的操作,因此文件的选择对话框FileOpenPicker、文件保存对话框FileSavePicker以及文件夹选择对话框FolderPicker十分重要。这三者的操作也比较简单。但有一些小细节可能许多人没注意到,听我慢慢道来,精彩留在后面。

三个对话框的操作在MSDN文档中也讲解的比较细致了,同时也有许多相似之处,我分开一个个做个简单的介绍。

FileOpenPicker:

MSDN文档:链接

属性:(主要)

ViewMode:文件的展示形式。有两个可选的枚举值,PickerViewMode.Thumbnail(缩略图形式)和PickerViewMode.List(列表形式)

SuggestedStartLocation:对话框打开时的默认路径。枚举值,详见 MSDN文档

FileTypeFilter:可选择的文件类型。也就是你要打开的是什么类型的文件,如txt、doc、jpg等。可以使用其Add方法添加类型。这个很重要,如果不设置会抛出异常

方法:

FileOpenPicker只有两个方法,PickSingleFileAsync和PickMultipleFilesAsync。两者都是打开对话框,需要await修饰,区别从方法签名就可以看出。使用PickSingleFileAsync,用户只能选取一个文件,使用PickMultipleFilesAsync,用户可以选取多个文件。

下面是FileOpenPicker的简单操作:

 private async void FileOpen_Click(object sender, RoutedEventArgs e)
{
FileOpenPicker picker = new FileOpenPicker();
picker.ViewMode = PickerViewMode.List; //设置文件的现实方式,这里选择的是图标
picker.SuggestedStartLocation =PickerLocationId.PicturesLibrary; //设置打开时的默认路径,这里选择的是图片库
picker.FileTypeFilter.Add("*"); //添加可选择的文件类型,这个必须要设置 "*"表示所有文件
file = await picker.PickSingleFileAsync(); //只能选择一个文件 if (file!=null)
{
//to do something
}
}

FileSavePicker:

msdn文档:链接

属性:(主要)

DefaultFileExtension:默认文件的拓展名

FileTypeChoices:文件的保存类型

SuggestedFileName:默认保存的文件名

SuggestedStartLocation:默认的文件保存位置

方法:

FileSavePicker只有一个方法:PickSaveFileAsync,打开对话框,需要await修饰

示例:

private async void FileSave_Click()
{
FileSavePicker picker = new FileSavePicker();
picker.DefaultFileExtension = ".txt";
picker.FileTypeChoices.Add("Plain Text", new List<string>() { ".txt" });
picker.SuggestedFileName = "New Document";
picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
StorageFile file = await picker.PickSaveFileAsync();
}

效果图:

尼玛,说好的精彩在后面呢?其实并没有什么精彩的,只是后面比前面的稍微比较有价值点

FolderPicker:

msdn文档:链接

属性:(主要)

几个主要的属性ViewMode、SuggestedStartLocation和FileTypeFilter都跟FileOpenPicker一样,就不多废话了。不过似乎设置FileTypeFilter并没有什么卵用,稍后说这个问题。

方法:QueryOptions

FolderPicker有两个方法,PickSingleFolderAsync和PickFolderAndContinue,打开文件夹选择器,都需要await修饰。前者用于WP中,后者用于PC上。

调用PickSingleFolderAsync获得folder之后,可以调用其.GetFilesAsync()方法获取当前文件夹下的文件。现在来说说那个没有什么卵用的FileTypeFilter。

看看下面几行代码:

private async void Folder_Click()
{
FolderPicker picker = new FolderPicker();
picker.FileTypeFilter.Add(".srt");
StorageFolder folder = await picker.PickSingleFolderAsync();
var files = await folder.GetFilesAsync();
int num = files.Count;
}

我的目的是读取桌面上的字幕文件(.srt)。运行后num的值为6,然而我的桌面是这样的,问题不言而喻了吧。没错虽然设置了FileTypeFilter,然而并没有什么卵用。

在传统的桌面程序中可以这么写,就可以得到正确的结果:

var file = Directory.GetFiles(folder, "*.srt");

解决方案:使用QueryOptions类

属性:

FileTypeFilter:同前面的一样,指定可选择的文件类型

FolderDepth:指示搜索查询是否应生成文件夹内容的浅表视图或所有文件和子文件夹的深递归视图。指示查询文件夹的深度的值。默认值为 FolderDepth.Shallow。预定义查询通常重写此属性并将其更改为 FolderDepth.Deep。(这是官方说的,其实我看不懂是什么东西)

IndexerOption:指定是否使用系统索引或文件系统来检索查询结果的值

然后就可以这么用了:

 private async void Folder_Click()
{
FolderPicker picker = new FolderPicker();
picker.FileTypeFilter.Add(".srt");
StorageFolder folder = await picker.PickSingleFolderAsync(); var queryOptions = new QueryOptions();
queryOptions.FileTypeFilter.Add(".srt");
//queryOptions.FolderDepth = FolderDepth.Shallow;
//queryOptions.IndexerOption = IndexerOption.DoNotUseIndexer; var query = folder.CreateFileQueryWithOptions(queryOptions);
var files = await query.GetFilesAsync(); int num = files.Count;
}

运行结果num为2,是正确的。到此FolderPicker的功能基本讲解完毕。

其实在查阅资料时,还发现了这么一个类:FileInformationFactory,官方解释是“用于从查询结果加载有关文件和文件夹的信息,并将这些文件系统项绑定到 JavaScript ListView 或 XAML ListView 和 GridView 控件。加载信息后,应用程序可使用同步操作快速访问该信息。”不太懂这段话的意思,以后用到了再回来补充吧。

文件操作之FileOpenPicker、FileSavePicker和FolderPicker的更多相关文章

  1. Win8.1应用开发之文件操作

    在操作文件之前,先相应用的应用功能声明进行设定.用户通过C#(非UI)对win8.1上的文件进行訪问,仅仅能局限于图片,音乐,视频和文档四个目录. 而通过文件选取器则能訪问到整个系统的文件. (一)应 ...

  2. 【.NET深呼吸】Zip文件操作(1):创建和读取zip文档

    .net的IO操作支持对zip文件的创建.读写和更新.使用起来也比较简单,.net的一向作风,东西都准备好了,至于如何使用,请看着办. 要对zip文件进行操作,主要用到以下三个类: 1.ZipFile ...

  3. 野路子出身PowerShell 文件操作实用功能

    本文出处:http://www.cnblogs.com/wy123/p/6129498.html 因工作需要,处理一批文件,本想写C#来处理的,后来想想这个是PowerShell的天职,索性就网上各种 ...

  4. Node基础篇(文件操作)

    文件操作 相关模块 Node内核提供了很多与文件操作相关的模块,每个模块都提供了一些最基本的操作API,在NPM中也有社区提供的功能包 fs: 基础的文件操作 API path: 提供和路径相关的操作 ...

  5. 归档NSKeyedArchiver解归档NSKeyedUnarchiver与文件管理类NSFileManager (文件操作)

    ========================== 文件操作 ========================== 一.归档NSKeyedArchiver 1.第一种方式:存储一种数据. // 归档 ...

  6. SQL Server附加数据库报错:无法打开物理文件,操作系统错误5

    问题描述:      附加数据时,提示无法打开物理文件,操作系统错误5.如下图: 问题原因:可能是文件访问权限方面的问题. 解决方案:找到数据库的mdf和ldf文件,赋予权限即可.如下图: 找到mdf ...

  7. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

  8. Linux文件操作的主要接口API及相关细节

    操作系统API: 1.API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用,应用层程序通过调用API来调用操作系统中的各种功能,来干活 文件操作的一般步骤: 1.在linux系统 ...

  9. C语言的fopen函数(文件操作/读写)

    头文件:#include <stdio.h> fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为:    FILE * fopen(const char * path, c ...

随机推荐

  1. Android 手机卫士--设置界面&功能列表界面跳转逻辑处理

    在<Android 手机卫士--md5加密过程>中已经实现了加密类,这里接着实现手机防盗功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959. ...

  2. IOS开发基础知识--碎片40

    1:Masonry快速查看报错小技巧 self.statusLabel = [UILabel new]; [self.contentView addSubview:self.statusLabel]; ...

  3. React Native知识4-Image组件

    一个用于显示多种不同类型图片的React组件,包括网络图片.静态资源.临时的本地图片.以及本地磁盘上的图片(如相册)等 一:属性 1:onLayout function 当元素挂载或者布局改变的时候调 ...

  4. JavaScript语言精粹(读书笔记)

    第一章 精华 1,JavaScript的函数(主要)基于词法作用域(lexical scoping)的顶级对象.强类型语言允许编译器在编译时检测错误,但弱类型很自由,无需建立复杂的类层次,不用做强制造 ...

  5. ORACLE 9i 数据库体系结构图

    ORACLE 9i 的数据库体系结构图,非常的全面.系统.高屋建瓴的整体介绍了ORACLE 9i 的数据库体系结构.如果能全面了解.清晰梳理.深入掌握这些知识点,相信对你了解学习.深入研究ORACLE ...

  6. 标题栏Menu

    标题栏menu就是指下图中红框里面的菜单按钮. 标题栏上所有的按钮或者其他元素都定义在xml文件里面,这些文件资源称为menu resource.要在标题栏添加按钮,需要在项目的/res/menu/路 ...

  7. Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法

    一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作.以减少我们在发布的时候出现更过甚至 ...

  8. ios合并静态库

    lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a -output SQY/ ...

  9. C# XML技术总结之XDocument 和XmlDocument

    引言 虽然现在Json在我们的数据交换中越来越成熟,但XML格式的数据还有很重要的地位. C#中对XML的处理也不断优化,那么我们如何选择XML的这几款处理类 XmlReader,XDocument ...

  10. 帆软报表FineReport中数据连接之Weblogic配置JNDI连接

    1. 制作报表的原理 在帆软报表FineReport设计器中先用JDBC连接到数据库,建立数据库连接,然后用SQL或者其他方法创建数据集,使用数据集制作报表,然后把建立的数据库连接从JDBC连接改成J ...