设为首页 收藏本站
查看: 865|回复: 0

重新想象 Windows 8 Store Apps (22)

[复制链接]

尚未签到

发表于 2015-5-22 09:20:09 | 显示全部楼层 |阅读模式
  [源码下载]




重新想象 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
[源码下载]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-69408-1-1.html 上篇帖子: Windows Phone 8初学者开发—第4部分:XAML简介 下篇帖子: Silverlight,Windows 8应用开发实例教程系列汇总
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表