使用 Windows 应用 SDK 和 WinRT API 访问文件和文件夹
打包的 Windows 应用 SDK 应用可以利用 WinRT API 读取和写入应用设置、文件和文件夹选取器以及特殊的沙盒式位置(例如视频/音乐库)。 此外,任何打包的桌面应用都可以利用 Windows SDK 中的 WinRT 和 Win32 API,以及 .NET SDK 中提供的 API。 本文提供有关如何使用 WinRT 存储 API 查询文件和文件夹、检索文件属性以及处理图片库的指导。
查询文件和文件夹
以下示例演示如何使用 StorageFolder 和 StorageFile API 在文档库中查询文件和文件夹。 该示例使用 GetFilesInFolderAsync
方法以递归方式循环访问文件夹结构,并将文件名追加到 StringBuilder
对象。
using System.Text;
using Windows.Storage;
...
private async Task<string> GetDocumentsContentsAsync()
{
StorageFolder docsFolder = KnownFolders.DocumentsLibrary;
StringBuilder outputBuilder = new();
await GetFilesInFolderAsync(docsFolder, outputBuilder);
return outputBuilder.ToString();
}
private async Task GetFilesInFolderAsync(StorageFolder folder, StringBuilder outputBuilder)
{
IReadOnlyList<IStorageItem> storageItem = await folder.GetItemsAsync();
foreach (var item in storageItem)
{
if (item is StorageFolder)
{
await GetFilesInFolderAsync(item as StorageFolder, outputBuilder);
}
else
{
outputBuilder.AppendLine($"Found {item.Name} in folder {folder.Name}");
}
}
}
获取基本文件属性
以下示例采用上一示例中的 GetFilesInFolderAsync
方法,并添加了检索每个文件的文件大小和修改日期的功能。 该示例使用 BasicProperties API 检索每个文件的文件大小和修改日期、设置文件大小的格式,并将文件大小和修改日期追加到每个文件和文件夹名称后的 StringBuilder
对象。
using System.Text;
using Windows.Storage;
using Windows.Storage.FileProperties;
...
private async Task GetFilesInFolderAsync(StorageFolder folder, StringBuilder outputBuilder)
{
IReadOnlyList<IStorageItem> storageItem = await folder.GetItemsAsync();
foreach (var item in storageItem)
{
if (item is StorageFolder)
{
await GetFilesInFolderAsync(item as StorageFolder, outputBuilder);
}
else
{
outputBuilder.AppendLine($"Found {item.Name} in folder {folder.Name}");
// Append each file's size and date modified.
BasicProperties basicProperties = await item.GetBasicPropertiesAsync();
string fileSize = string.Format("{0:n0}", basicProperties.Size);
outputBuilder.AppendLine($" - File size: {fileSize} bytes");
outputBuilder.AppendLine($" - Date modified: {basicProperties.DateModified}");
}
}
}
处理图片库
在此示例中,应用配置为在更新图片库时接收通知。 该示例使用 StorageLibrary API 检索图片库和 DefinitionChanged 事件,以在库更新时接收通知。 在当前库中的文件夹列表更改时,会调用 DefinitionChanged
事件。 该示例使用库的 Folders
属性循环访问图片库中的文件夹,并将文件夹名称写入控制台。
using Windows.Storage;
...
private async Task Configure()
{
StorageLibrary picturesFolder = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures);
picturesFolder.DefinitionChanged += picturesFolder_DefinitionChanged;
}
private void picturesFolder_DefinitionChanged(StorageLibrary sender, object args)
{
foreach (StorageFolder item in sender.Folders)
{
Console.WriteLine($"Folder {item.Name} found.");
}
}