文件操作之FileOpenPicker、FileSavePicker和FolderPicker
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 控件。加载信息后,应用程序可使用同步操作快速访问该信息。”不太懂这段话的意思,以后用到了再回来补充吧。