UWP 文件系統(tǒng)接口
本文章翻譯自 MSDN
UWP 文件系統(tǒng)的相關(guān)接口都放在下面三個(gè)名稱空間中:
Windows.Storage
Windows.Storage.Streams
Windows.Storage.Pickers
文件訪問權(quán)限
在 UWP 平臺(tái)中,程序?qū)ξ募脑L問受到了限制。默認(rèn)情況下,程序僅能訪問少數(shù)幾個(gè)特定位置。如果要訪問其他位置,需要通過 file picker 或者在 manifest 中聲明權(quán)限才行。
程序默認(rèn)可以訪問的位置
你的 app 無(wú)需做任何操作就可以訪問下面幾個(gè)位置:
-
程序安裝目錄
訪問程序安裝目錄主要有兩個(gè)方法:- 通過 Package.Current.InstalledLocation 獲取 StorageFolder:
Windows.Storage.StorageFolder installedLocation = Windows.ApplicationModel.Package.Current.InstalledLocation;
- 通過 app URI 獲取 StorageFile:
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync("ms-appx:///file.txt");
"ms-appx:///" 前綴就代表程序安裝目錄,具體可以參考How to use URIs to reference content
程序安裝目錄是 只讀 目錄,并且無(wú)法通過 file picker 獲取。
-
程序的數(shù)據(jù)區(qū)
給程序存儲(chǔ)數(shù)據(jù)用的文件夾。這些文件夾(local, roaming and temporary)會(huì)在程序安裝時(shí)創(chuàng)建。
訪問程序的數(shù)據(jù)區(qū)主要有兩個(gè)方法:- 通過 ApplicationData.Current.LocalFolder 獲取 StorageFolder:
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
除了 LocalFolder 屬性,還可以使用 RoamingFolder 或 TemporaryFolder 屬性來(lái)獲取其他文件夾。
要了解更多關(guān)于 app data locations 的使用方法,可以參考 Managing application data
- 通過 app URI 獲取 StorageFile:
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync("ms-appdata:///local/file.txt");
"ms-appdata:///local/" 前綴就代表 LocalFolder,還可以使用 "ms-appdata:///roaming/" 或 "ms-appdata:///temporary/" 來(lái)獲取另外兩個(gè)文件夾。要了解 app URIs 的更多知識(shí),具體可以參考:How to load file resources
程序數(shù)據(jù)區(qū)是 可讀寫 目錄,并且無(wú)法通過 file picker 獲取。
- 可插拔設(shè)備
枚舉文件和文件夾
// 獲取圖片文件夾所在的 StorageFolder
StorageFolder picFolder = KnownFolders.PicturesLibrary;
// 獲取圖片文件夾下所有文件(不會(huì)遞歸子目錄)
IReadOnlyList<StorageFile> fileList = await picFolder.GetFilesAsync();
// 獲取圖片文件夾下所有子文件夾(不會(huì)遞歸子目錄)
IReadOnlyList<StorageFolder> folderList = await picFolder.GetFoldersAsync();
// 獲取圖片文件夾下所有子項(xiàng)(不會(huì)遞歸子目錄)
IReadOnlyList<IStorageItem> itemList = await picFolder.GetItemsAsync();
// 獲取圖片文件夾中名為 Screenshots 的文件夾
IStorageItem item = await picFolder.TryGetItemAsync("Screenshots");
if (item != null && item is StorageFolder)
{
StorageFolder screenshotsFolder = item as StorageFolder;
}
// 查詢圖片文件夾下所有 .png 文件(遞歸子目錄)
QueryOptions queryOptions = new QueryOptions();
queryOptions.FileTypeFilter.Add(".png");
queryOptions.FolderDepth = FolderDepth.Deep;
StorageFileQueryResult queryResult = picFolder.CreateFileQueryWithOptions(queryOptions);
IReadOnlyList<StorageFile> queryFileList = await queryResult.GetFilesAsync();
注意 使用以上代碼前,要先在 Package.appxmanifest 里添加圖片庫(kù)的訪問權(quán)限。