使用 WinUI 和 WinRT API 访问文件和文件夹

WinUI 应用可以使用 Windows 运行时 (WinRT) API 访问文件和文件夹,以便执行常见文件作。 本文介绍如何访问文件和文件夹、查询系统库、检索文件属性以及处理图片和文档等位置。

生成打包的 WinUI 应用时,可以使用 WinRT API 访问特定位置中的文件和文件夹。 这些 API 允许你读取和写入应用设置、打开文件和文件夹选取器,以及处理视频和音乐库等沙盒位置。 还可以将 WinRT API 与 Windows SDK 中的 Win32 API 和 .NET SDK 中的 API 组合在一起。

本文重点介绍 WinRT 存储 API ,并演示如何:

  • 查询系统库中的文件和文件夹
  • 检索基本文件属性,如大小和修改日期
  • 监视对图片库的更改

查询文件和文件夹

以下示例演示如何使用 StorageFolderStorageFile 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.");
    }
}

另请参阅

使用 Windows 应用 SDK 和 .NET API 访问文件和文件夹

使用 Windows 应用 SDK 创建的文件、文件夹和库