Exploring WinRT: File and Folder Pickers

October 07, 2011
C# File System Windows 8 WinRT
 

Exploring WinRT:

1. Windows.Storage namespace overview
2. File and Folder Pickers
3. Storage.AccessCache

So, because we are very restricted in accessing file system directly, sometimes we will need user’s help to access files and folder. There are three classes that give app access to the locations unavailable through Storage APIs - FileOpenPicker, FileSavePicker and FolderPicker - Windows 8’s replacement for the well know Open/Save dialogs. They represent UI elements that let users choose files and folders to open or file name and location to save a file.

FileOpenPicker

Using the picker, user can browse the file system and select one or multiple files to open. The following code was used to show this screen:

var filePicker = new FileOpenPicker();
filePicker.FileTypeFilter.Add(".jpg");
filePicker.ViewMode = PickerViewMode.Thumbnail;
filePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
filePicker.SettingsIdentifier = "picker1";
filePicker.CommitButtonText = "Open File to Process";

var files = await filePicker.PickMultipleFilesAsync();

To use the file picker, you have to add at least one file extension to FileTypeFilter collection, to indicate what file types are supported by the app. If FileTypeFilter is empty, file picker will throw “Unspecified error” exception on open. To show all files filter “*” should be used.

There is no way to open files without extension. FileTypeFilter accepts “.” as the filter but does not show anything when this filter is used.

All other properties are optional.

ViewMode property allows you to define how the items will be displayed. You can choose between Thumbnail and List, but be careful selecting the appropriate mode. User will not be able to switch it within the picker and may not be very happy if you will propose him to select an image using List view.

SuggestedStartLocation is used to suggest to the picker a folder to display. “Suggest” is a right word – this property is used only once, when the picker is opened for the first time. Next time when picker will be used, even if the application was restarted, the property is ignored and the last used folder is used as the start location.

Moreover, if you have more than one file picker in your app, all of them will share the same start location. If this behaviour is not what you expected, you can use SettingsIdentifier property to define a scope – all the pickers with the same SettingsIdentifier will share the same start location. The opposite is also true – locations for the pickers with the different identifiers are tracked separately.

CommitButtonText can be used to override standard “Open” text with something more specific.

And, finally, one of the two functions – PickMultipleFilesAsync or PickSingleFileAsync – should be used to show the configured picker to the user.

FileSavePicker

var fileSavePicker = new FileSavePicker();
fileSavePicker.FileTypeChoices.Add("Raw Images", new List { ".raw", ".dat" });
fileSavePicker.FileTypeChoices.Add(".jpg Image", new List { ".jpg" });
fileSavePicker.DefaultFileExtension = “.jpg”;
fileSavePicker.SuggestedFileName = “i08.jpg”;
filePicker.SettingsIdentifier = "picker1";

var fileToSave = await fileSavePicker.PickSaveFileAsync();

Similar to FileOpenPicker you have to add at least one file type to FileTypeChoices collection and the rest of the properties are optional.

If your app supports multiple file types, you can use DefaultFileExtension property to define a preferred one. Also the app can set SuggestedFileName property to suggest a full file name, so users don’t need to type it. Alternatively, if StorageFile object is already instantiated, you can use SuggestedSaveFile property

fileSavePicker.SuggestedSaveFile = file;

and it will automatically extract the default extension and suggested file name for you.

FileSavePicker.SettingsIdentifier works identical to FileOpenPicker.SettingsIdentifier and you can use the same identifiers to synchronize the open and save pickers.

ViewMode is not supported by FileSavePicker.

Method PickSaveFileAsync() returns StorageFile object linked with a newly created zero-sized file. If user selected existed file and allowed to override it, the file will be deleted and replaced with an empty one with the same name.

FolderPicker

There is nothing special about this dialog; the properties and usage are pretty similar to FileOpenPicker.

var folderPicker = new FolderPicker();
folderPicker.FileTypeFilter.Add(".jpg");
folderPicker.ViewMode = PickerViewMode.Thumbnail;
folderPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
folderPicker.SettingsIdentifier = "FolderPicker";

var folder = await folderPicker.PickSingleFolderAsync();
blog comments powered by Disqus