| 
 | 
	
 
 
  [源码下载] 
 
 
 
 
重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件   
作者:webabcd 
 
介绍 
重新想象 Windows 8 Store Apps 之 文件系统 
 
 
- File Access - 访问文件夹和文件,以及获取文件的各种属性
 
 - Folder Access - 遍历文件夹时的一些特殊操作
 
 - Thumbnail Access - 获取文件的缩略图
 
 - AQS - 通过 AQS(Advanced Query Syntax)搜索本地文件
 
     
示例 
1、演示如何访问文件夹和文件,以及如何获取文件的各种属性 
FileSystem/FileAccess.xaml 
 
 
 
 
 
 
 
 
 
 
 
  FileSystem/FileAccess.xaml.cs 
 
 
 
/* 
* 演示如何访问文件夹和文件,以及如何获取文件的各种属性 
*  
* StorageFolder - 文件夹操作类 
*     获取文件夹相关属性、重命名、Create...、Get...等 
*  
* StorageFile - 文件操作类 
*     获取文件相关属性、重命名、Create...、Get...、Copy...、Move...、Delete...、Open...、Replace...等 
*      
* 注:WinRT 中的关于存储操作的相关类都在 Windows.Storage 命名空间内 
*/ 
using System; 
using System.Collections.Generic; 
using Windows.Storage; 
using Windows.Storage.FileProperties; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Navigation; 
using System.Linq; 
namespace XamlDemo.FileSystem 
{ 
public sealed partial class FileAccess : Page 
{ 
public FileAccess() 
{ 
this.InitializeComponent(); 
} 
protected async override void OnNavigatedTo(NavigationEventArgs e) 
{ 
// 遍历“文档库”目录下的所有顶级文件(需要在 Package.appxmanifest 中选中“文档库”功能) 
StorageFolder storageFolder = KnownFolders.DocumentsLibrary; 
IReadOnlyList files = await storageFolder.GetFilesAsync(); 
listBox.ItemsSource = files.Select(p => p.Name).ToList(); 
} 
private async void listBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e) 
{ 
// 获取用户选中的文件 
string fileName = (string)listBox.SelectedItem; 
StorageFolder storageFolder = KnownFolders.DocumentsLibrary; 
StorageFile storageFile = await storageFolder.GetFileAsync(fileName); 
// 显示文件的各种属性 
if (storageFile != null) 
{ 
lblMsg.Text = "Name:" + storageFile.Name; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "FileType:" + storageFile.FileType; 
lblMsg.Text += Environment.NewLine; 
BasicProperties basicProperties = await storageFile.GetBasicPropertiesAsync(); 
lblMsg.Text += "Size:" + basicProperties.Size; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "DateModified:" + basicProperties.DateModified; 
lblMsg.Text += Environment.NewLine; 
/* 
* 获取文件的其它各种属性 
* 详细属性列表请参见:http://msdn.microsoft.com/en-us/library/windows/desktop/ff521735(v=vs.85).aspx 
*/ 
List propertiesName = new List(); 
propertiesName.Add("System.DateAccessed"); 
propertiesName.Add("System.DateCreated"); 
propertiesName.Add("System.FileOwner"); 
IDictionary extraProperties = await storageFile.Properties.RetrievePropertiesAsync(propertiesName); 
lblMsg.Text += "System.DateAccessed:" + extraProperties["System.DateAccessed"]; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "System.DateCreated:" + extraProperties["System.DateCreated"]; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "System.FileOwner:" + extraProperties["System.FileOwner"]; 
} 
} 
} 
} 
   
2、演示遍历文件夹时的一些特殊操作 
FileSystem/FolderAccess.xaml 
 
 
 
 
 
 
 
 
 
 
 
 
  FileSystem/FolderAccess.xaml.cs 
 
 
 
/* 
* 演示遍历文件夹时的一些特殊操作 
* 1、演示如何对 StorageFolder 中的内容做分组 
* 2、演示如何通过文件扩展名过滤内容,以及如何从 Prefetch 中获取数据 
*  
* StorageFolder - 文件夹操作类 
*     获取文件夹相关属性、重命名、Create...、Get...等 
*  
* StorageFile - 文件操作类 
*     获取文件相关属性、重命名、Create...、Get...、Copy...、Move...、Delete...、Open...、Replace...等 
*      
* 注:WinRT 中的关于存储操作的相关类都在 Windows.Storage 命名空间内 
*/ 
using System; 
using System.Collections.Generic; 
using Windows.Storage; 
using Windows.Storage.FileProperties; 
using Windows.Storage.Search; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Navigation; 
namespace XamlDemo.FileSystem 
{ 
public sealed partial class FolderAccess : Page 
{ 
public FolderAccess() 
{ 
this.InitializeComponent(); 
} 
// 演示如何对 StorageFolder 中的内容做分组 
private async void btnGroupFile_Click_1(object sender, Windows.UI.Xaml.RoutedEventArgs e) 
{ 
lblMsg.Text = ""; 
StorageFolder picturesFolder = KnownFolders.PicturesLibrary; 
// 创建一个按月份分组的查询 
QueryOptions queryOptions = new QueryOptions(CommonFolderQuery.GroupByMonth); 
// 对指定文件夹执行指定的文件夹查询,返回分组后的文件夹数据 
StorageFolderQueryResult queryResult = picturesFolder.CreateFolderQueryWithOptions(queryOptions); 
IReadOnlyList folderList = await queryResult.GetFoldersAsync(); 
foreach (StorageFolder folder in folderList) // 这里的 floder 就是按月份分组后的月份文件夹(当然,物理上并没有月份文件夹) 
            { 
IReadOnlyList fileList = await folder.GetFilesAsync(); 
lblMsg.Text += folder.Name + " (" + fileList.Count + ")"; 
lblMsg.Text += Environment.NewLine; 
foreach (StorageFile file in fileList) // 月份文件夹内的文件 
                { 
lblMsg.Text += "    " + file.Name; 
lblMsg.Text += Environment.NewLine; 
} 
} 
} 
// 演示如何通过文件扩展名过滤内容,以及如何从 Prefetch 中获取数据 
private async void btnPrefetchAPI_Click_1(object sender, Windows.UI.Xaml.RoutedEventArgs e) 
{ 
/* 
* Prefetch 是预读的文件信息,其在 C:\Windows\Prefetch 目录内,可以从中获取文件属性信息和文件缩略图,在访问大量文件的场景下可以提高效率 
*/ 
lblMsg.Text = ""; 
List fileTypeFilter = new List(); 
fileTypeFilter.Add(".jpg"); 
fileTypeFilter.Add(".png"); 
// 新建一个查询,指定需要查询的文件的扩展名 
QueryOptions queryOptions = new QueryOptions(CommonFileQuery.OrderByName, fileTypeFilter); 
// 通过 QueryOptions.SetPropertyPrefetch() 来设置需要从 Prefetch 中获取的属性信息 
List propertyNames = new List(); 
propertyNames.Add("System.FileOwner"); 
queryOptions.SetPropertyPrefetch(PropertyPrefetchOptions.ImageProperties, propertyNames); 
/* 
* 通过 QueryOptions.SetThumbnailPrefetch() 来设置需要从 Prefetch 中获取的缩略图 
uint requestedSize = 190; 
ThumbnailMode thumbnailMode = ThumbnailMode.PicturesView; 
ThumbnailOptions thumbnailOptions = ThumbnailOptions.UseCurrentScale; 
queryOptions.SetThumbnailPrefetch(thumbnailMode, requestedSize, thumbnailOptions); 
*/ 
// 对指定文件夹执行指定的文件查询,返回查询后的文件数据 
StorageFileQueryResult queryResult = KnownFolders.PicturesLibrary.CreateFileQueryWithOptions(queryOptions); 
IReadOnlyList fileList = await queryResult.GetFilesAsync(); 
foreach (StorageFile file in fileList) 
{ 
lblMsg.Text += file.Name; // 文件名 
// 获取图像属性 
ImageProperties properties = await file.Properties.GetImagePropertiesAsync();  
lblMsg.Text += "(" + properties.Width + "x" + properties.Height + ")"; 
// 获取其他属性(详细属性列表请参见:http://msdn.microsoft.com/en-us/library/windows/desktop/ff521735(v=vs.85).aspx) 
IDictionary extraProperties = await file.Properties.RetrievePropertiesAsync(propertyNames); 
lblMsg.Text += "(" + extraProperties["System.FileOwner"] + ")"; 
// 获取缩略图 
// StorageItemThumbnail thumbnail = await file.GetThumbnailAsync(thumbnailMode, requestedSize, thumbnailOptions); 
            } 
} 
} 
} 
   
3、演示如何获取文件的缩略图 
FileSystem/ThumbnailAccess.xaml 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  FileSystem/ThumbnailAccess.xaml.cs 
 
 
 
/* 
* 演示如何获取文件的缩略图 
*  
* 获取指定文件或文件夹的缩略图,返回 StorageItemThumbnail 类型的数据 
* StorageFile.GetThumbnailAsync(ThumbnailMode mode, uint requestedSize, ThumbnailOptions options) 
* StorageFolder.GetThumbnailAsync(ThumbnailMode mode, uint requestedSize, ThumbnailOptions options) 
*     ThumbnailMode mode - 用于描述缩略图的目的,以使系统确定缩略图图像的调整方式(PicturesView, VideosView, MusicView, DocumentsView, ListView, SingleItem) 
*         关于 ThumbnailMode 的详细介绍参见:http://msdn.microsoft.com/en-us/library/windows/apps/hh465350.aspx 
*     uint requestedSize - 期望尺寸的最长边长的大小 
*     ThumbnailOptions options - 检索和调整缩略图的行为(None, ReturnOnlyIfCached, ResizeThumbnail, UseCurrentScale) 
*/ 
using System; 
using Windows.Storage; 
using Windows.Storage.FileProperties; 
using Windows.Storage.Pickers; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Media.Imaging; 
namespace XamlDemo.FileSystem 
{ 
public sealed partial class ThumbnailAccess : Page 
{ 
public ThumbnailAccess() 
{ 
this.InitializeComponent(); 
} 
private async void btnGetThumbnail_Click_1(object sender, RoutedEventArgs e) 
{ 
if (XamlDemo.Common.Helper.EnsureUnsnapped()) 
{ 
FileOpenPicker openPicker = new FileOpenPicker(); 
openPicker.FileTypeFilter.Add("*"); 
StorageFile file = await openPicker.PickSingleFileAsync(); 
if (file != null) 
{    
ThumbnailMode thumbnailMode = ThumbnailMode.PicturesView; 
ThumbnailOptions thumbnailOptions = ThumbnailOptions.UseCurrentScale; 
uint requestedSize = 200; 
using (StorageItemThumbnail thumbnail = await file.GetThumbnailAsync(thumbnailMode, requestedSize, thumbnailOptions))  
{ 
if (thumbnail != null) 
{ 
BitmapImage bitmapImage = new BitmapImage(); 
bitmapImage.SetSource(thumbnail); 
img.Source = bitmapImage; 
lblMsg.Text = "file name: " + file.Name; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "requested size: " + requestedSize; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "returned size: " + thumbnail.OriginalWidth + "*" + thumbnail.OriginalHeight; 
} 
} 
} 
} 
} 
} 
} 
   
4、演示如何通过 AQS - Advanced Query Syntax 搜索本地文件 
FileSystem/AQS.xaml.cs 
 
 
 
/* 
* 演示如何通过 AQS - Advanced Query Syntax 搜索本地文件 
*/ 
using System; 
using System.Collections.Generic; 
using Windows.Storage; 
using Windows.Storage.BulkAccess; 
using Windows.Storage.FileProperties; 
using Windows.Storage.Search; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Navigation; 
namespace XamlDemo.FileSystem 
{ 
public sealed partial class AQS : Page 
{ 
public AQS() 
{ 
this.InitializeComponent(); 
} 
protected async override void OnNavigatedTo(NavigationEventArgs e) 
{ 
// 准备在“音乐库”中进行搜索(需要在 Package.appxmanifest 的“功能”中选中“音乐库”) 
StorageFolder musicFolder = KnownFolders.MusicLibrary; 
// 准备搜索所有类型的文件 
List fileTypeFilter = new List(); 
fileTypeFilter.Add("*"); 
// 搜索的查询参数 
QueryOptions queryOptions = new QueryOptions(CommonFileQuery.OrderByDate, fileTypeFilter); 
// 指定 AQS 字符串,参见 http://msdn.microsoft.com/zh-cn/library/windows/apps/aa965711.aspx 
queryOptions.UserSearchFilter = "五月天"; 
// 根据指定的参数创建一个查询 
StorageFileQueryResult fileQuery = musicFolder.CreateFileQueryWithOptions(queryOptions); 
lblMsg.Text = "在音乐库中搜索“五月天”,结果如下:"; 
lblMsg.Text += Environment.NewLine; 
// 开始搜索,并返回检索到的文件列表 
IReadOnlyList files = await fileQuery.GetFilesAsync(); 
if (files.Count == 0) 
{ 
lblMsg.Text += "什么都没搜到"; 
} 
else 
{ 
foreach (StorageFile file in files) 
{ 
lblMsg.Text += file.Name; 
lblMsg.Text += Environment.NewLine; 
} 
} 
 
// 关于 QueryOptions 的一些用法,更详细的 QueryOptions 的说明请参见 msdn 
queryOptions = new QueryOptions(); 
queryOptions.FolderDepth = FolderDepth.Deep; 
queryOptions.IndexerOption = IndexerOption.UseIndexerWhenAvailable; 
queryOptions.SortOrder.Clear(); 
var sortEntry = new SortEntry(); 
sortEntry.PropertyName = "System.FileName"; 
sortEntry.AscendingOrder = true; 
queryOptions.SortOrder.Add(sortEntry); 
fileQuery = KnownFolders.PicturesLibrary.CreateFileQueryWithOptions(queryOptions); 
} 
} 
} 
   
OK 
[源码下载] |   
 
 
 
 | 
  
 |