共用方式為


使用 WinUI 3 和 WinRT API 存取檔案和資料夾

WinUI 應用程式可使用 Windows Runtime(WinRT)API 來存取檔案和資料夾,以進行常見的檔案操作。 本文將教你如何access檔案和資料夾、查詢系統函式庫、取得檔案屬性,以及操作像是圖片和文件等位置。

當你建立打包的 WinUI 應用程式時,可以使用 WinRT APIS 來在特定位置access檔案和資料夾。 這些 API 可讓您讀取和寫入應用程式設定、開啟檔案和資料夾選擇器,以及使用影片和音樂庫等沙箱位置。 你也可以將 WinRT API 與 Windows SDK 的 Win32 API 以及 .NET SDK 的 API 結合。

本文聚焦於 WinRT storage API,並示範如何:

  • 查詢系統庫中的檔案和資料夾
  • 檢索基本文件屬性,例如大小和修改日期
  • 監視圖片庫的變更

查詢檔案和資料夾

以下範例說明如何使用 StorageFolderStorageFile API 查詢 Documents 函式庫中的檔案與資料夾。 這個範例使用 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 來取得 Pictures 函式庫及 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 App SDK 和 .NET API 存取檔案與資料夾

檔案、資料夾與函式庫,Windows App SDK