次の方法で共有


WinUI API と WinRT API を使用してファイルとフォルダーにアクセスする

WinUI アプリは、一般的なファイル操作のために Windows ランタイム (WinRT) API を使用してファイルとフォルダーにアクセスできます。 この記事では、ファイルとフォルダーへのアクセス、システム ライブラリのクエリの実行、ファイルのプロパティの取得、画像やドキュメントなどの場所の操作を行う方法について説明します。

パッケージ化された WinUI アプリをビルドするときに、 WinRT API を 使用して、特定の場所にあるファイルやフォルダーにアクセスできます。 これらの API を使用すると、アプリの設定の読み取りと書き込み、ファイルとフォルダーの選択を開き、ビデオ ライブラリやミュージック ライブラリなどのサンドボックスの場所を操作できます。 また、WinRT API と Windows SDK の Win32 API と 、.NET SDK の API を組み合わせることもできます。

この記事では、 WinRT ストレージ 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 プロパティを使用して Pictures ライブラリ内のフォルダーを反復処理し、そのフォルダー名をコンソールに書き込みます。

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 を使用したファイル、フォルダー、ライブラリの操作