Win10的開發經常需要進行檔案的操作,是以檔案的選擇對話框FileOpenPicker、檔案儲存對話框FileSavePicker以及檔案夾選擇對話框FolderPicker十分重要。這三者的操作也比較簡單。但有一些小細節可能許多人沒注意到,聽我慢慢道來,精彩留在後面。
三個對話框的操作在MSDN文檔中也講解的比較細緻了,同時也有許多相似之處,我分開一個個做個簡單的介紹。
FileOpenPicker:
MSDN文檔:連結
屬性:(主要)
ViewMode:檔案的展示形式。有兩個可選的枚舉值,PickerViewMode.Thumbnail(縮略圖形式)和PickerViewMode.List(清單形式)
SuggestedStartLocation:對話框打開時的預設路徑。枚舉值,詳見 MSDN文檔
FileTypeFilter:可選擇的檔案類型。也就是你要打開的是什麼類型的檔案,如txt、doc、jpg等。可以使用其Add方法添加類型。這個很重要,如果不設定會抛出異常
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMycjNyczM0ETMzgDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
方法:
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(".srt"); //添加可選擇的檔案類型,這個必須要設定
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 控件。加載資訊後,應用程式可使用同步操作快速通路該資訊。”不太懂這段話的意思,以後用到了再回來補充吧。