Поделиться через


Доступ к файлам и папкам с помощью API WinUI и WinRT

Приложения WinUI могут получать доступ к файлам и папкам с помощью API среды выполнения Windows (WinRT) для распространенных операций с файлами. В этой статье показано, как получить доступ к файлам и папкам, запрашивать системные библиотеки, извлекать свойства файла и работать с такими расположениями, как изображения и документы.

При создании упакованных приложений WinUI можно использовать API WinRT для доступа к файлам и папкам в определенных расположениях. Эти API позволяют считывать и записывать параметры приложения, открывать средства выбора файлов и папок, а также работать с изолированными расположениями, такими как библиотеки видео и музыки. Вы также можете объединить API WinRT с API Win32 из пакета SDK для Windows и API из пакета SDK для .NET.

В этой статье рассматриваются API-интерфейсы хранилища WinRT и демонстрируется, как:

  • Запрос файлов и папок в системных библиотеках
  • Получение основных свойств файла, таких как дата размера и изменения
  • Мониторинг изменений в библиотеке изображений

Запрос файлов и папок

В следующем примере показано, как использовать API StorageFolder и StorageFile для запроса библиотеки 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 метод из предыдущего примера и добавляет возможность получения размера файла и даты, измененной для каждого файла. В примере используется API BasicProperties для получения размера файла и даты изменения для каждого файла, форматирования размера файла, а также добавления размера и даты изменения в объект 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}");
        }
    }
}

Работа с библиотекой изображений

В этом примере приложение настроено на получение уведомлений, когда обновляется библиотека изображений . В примере используется API StorageLibrary для получения библиотеки рисунков и события 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.");
    }
}

См. также

Доступ к файлам и папкам с помощью пакета SDK для приложений Windows и API .NET

Файлы, папки и библиотеки в Windows App SDK