Файловая система

Работа с папками

Последнее обновление: 24.02.2016

Windows 10 предоставляет новый API для работы с файлами. Основу этого API составляет пространство имен Windows.Storage, в котором и сосредоточен весь функционал для работы с файлами.

Одними из важнейших классов в этом API являются StorageFile и StorageFolder. Класс StorageFile возвращает информацию об определенном файле и его содержимом, а также предоставляет способы для манипуляции с этим файлом. А класс StorageFolder предназначен для управления папками пользователя.

При работе с файлами и папками надо учитывать, что нам доступны определенные виды хранилищ файлов и папок, с которыми мы можем взаимодействовать. Файл в Windows 10 может быть сохранен в самых различных местах: на локальном компьютере, на съемном жестком диске или флешке, в облаке. Все типы папок вне зависимости от местонахождения представлены классом StorageFolder.

По умолчанию разработчик имеет доступ к следующим папкам в системе пользователя:

  • Папка, в которую установлено приложение. Эта папка содержит все файлы и каталоги, которые были созданы в проекте (это любые папки, в которых для файлов у свойства Build Action установлено значение "Content"). Так как эта папка полностью удаляется или пересоздается при каждом удалении/переустановке/обновлении приложения, то все сделанные изменения в этой папке будут удалены вместе с переустановкой или удалением приложения.

    Чтобы получить эту папку, можно использовать следующее выражение:

    StorageFolder installedLocation = ApplicationModel.Package.Current.InstalledLocation;
    

    Кроме того, мы можем напрямую обратиться к файлам из этой папки, используя специальные адреса Uri с префиксом "ms-appx:///":

    StorageFile file = await StorageFile.GetFileFromApplicationUriAsync("ms-appx:///file.txt");
    
  • Каталоги, предназначенные для хранения данных. Это три папки: локальная (local), перемещаемая (roaming) и временная (temp). Эти папки создаются при установке приложения. Для получения доступа к этим папкам, можно использовать следующие выражения:

    StorageFolder localFolder = ApplicationData.Current.LocalFolder; // локальная папка
    StorageFolder roamingFolder = ApplicationData.Current.RoamingFolder; // перемещаемая папка
    StorageFolder tempFolder = ApplicationData.Current.TemporaryFolder; // временная папка
    

    Также мы можем, используя специальные адреса Uri, обратиться к файлам из этих папок:

    StorageFile localFile = await StorageFile.GetFileFromApplicationUriAsync("ms-appdata:///local/file.txt");
    StorageFile roamingFile = await StorageFile.GetFileFromApplicationUriAsync("ms-appdata:///roaming/file.txt");
    StorageFile tempFile = await StorageFile.GetFileFromApplicationUriAsync("ms-appdata:///temporary/file.txt");
    

    При использовании папки TemporaryFolder следует учитывать, что содержимое этой папки в любое время может быть удалено системой, либо самим пользователем через средства удаления временных файлов, как Disk Cleanup.

Класс StorageFolder, который представляет все эти папки, позволяет управлять ими через ряд своих методов:

  • GetFolderAsync(): возвращает вложенную папку по имени

  • GetFoldersAsync(): возвращает все вложенные папки

  • GetFilesAsync(): возвращает все вложенные файлы

  • GetFileAsync(): возвращает один файл по имени

  • CreateFileAsync(): создает новый файл

  • CreateFolderAsync(): создает новую папку

  • DeleteAsync(): удаляет текущую папку

  • GetItemsAsync(): возвращает все вложенные папки и файлы

  • GetItemAsync(): возвращает по имени либо файл, либо папку, в зависимости, что этому имени соответствует

  • GetParentAsync(): возвращает родительскую папку

  • OpenStreamForReadAsync(): открывает поток для чтения

  • OpenStreamForWriteAsync(): открывает поток для записи

  • RenameAsync(): переименовывает папку

С помощью свойств StorageFolder мы можем получить информацию о папке:

  • Attributes: возвращает атрибуты данной папки

  • DateCreated: возвращает дату создания папки

  • DisplayName: возвращает отображаемое имя папки

  • Name: возвращает имя папки

  • Path: возвращает полный путь к данной папке в файловой системе

Для примера создадим проект, в который поместим папку с файлами:

Работа с папками на Universal Windows Platform

Здесь в проект добавлена папка Data, в которой есть два файла. Получим этим файлы в программе. Для этого в коде разметки xaml определим ListBox:

<Page
    x:Class="FoldersApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:FoldersApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" Loaded="Page_Loaded">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <ListBox x:Name="filesList"  />
    </Grid>
</Page>

А в файле кода C# определим обработчик события загрузки страницы:

using System;
using System.Collections.Generic;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace FoldersApp
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private async void Page_Loaded(object sender, RoutedEventArgs e)
        {
            StorageFolder installedLocation = Windows.ApplicationModel.Package.Current.InstalledLocation;

			// получаем папку Data
            StorageFolder folder = await installedLocation.GetFolderAsync("data");
            IReadOnlyList<StorageFile> files = await folder.GetFilesAsync();

			filesList.Items.Add($"Содержимое папки {folder.DisplayName}");
			
            foreach (StorageFile file in files)
                filesList.Items.Add(file.Name);
        }
    }
}

Так как папка Data у нас в проекте, то при установке она попадает в текущую папку приложения, поэтому для ее получения сначала получаем текущую папку приложения с помощью выражения Windows.ApplicationModel.Package.Current.InstalledLocation. Получив все файлы, выводим их в ListBox:

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850