Работа с файлами

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

Каждая мобильная платформа имеет свою специфику, свою файловую систему, свою структуру каталогов. Тем не менее работа с файлами и каталогами в Xamarin Forms производиться также, как и в целом .NET - с помощью классов из пространства имен System.IO. Например, для работы с каталогами можно использовать классы Directory и DirectoryInfo, а для работы с файлами - классы File и FileInfo.

Так как в Xamarin Forms применяются те же самые классы из System.IO, поэтому не будем подробно на них останавливаться. Рассмотрим, как их можно применить в рамках приложения Xamarin Forms.

В коде MainPage.xaml определим следующее содержимое:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             
             x:Class="HelloApp.MainPage">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
      <RowDefinition Height="*" />
      <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <StackLayout Orientation="Horizontal">
      <Entry x:Name="fileNameEntry" HorizontalOptions="FillAndExpand" />
      <Button Text="Сохранить" Clicked="Save" />
    </StackLayout>
    <Editor Grid.Row="1" x:Name="textEditor" />
    <ListView x:Name="filesList" Grid.Row="2" ItemSelected="FileSelect">
      <ListView.ItemTemplate> 
        <DataTemplate> 
          <TextCell Text="{Binding}"> 
            <TextCell.ContextActions> 
              <MenuItem Text="Удалить" IsDestructive="True" Clicked="Delete" /> 
            </TextCell.ContextActions> 
          </TextCell> 
        </DataTemplate> 
      </ListView.ItemTemplate>
    </ListView>
  </Grid>
</ContentPage>

В коде C# у MainPage определим все обработчики используемых событий:

using Xamarin.Forms;
using System;
using System.IO;
using System.Linq;

namespace HelloApp
{
    public partial class MainPage : ContentPage
    {
        string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        public MainPage()
        {
            InitializeComponent();
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            UpdateFileList();
        }
        // сохранение текста в файл
        async void Save(object sender, EventArgs args)
        {
            string filename = fileNameEntry.Text;
            if (String.IsNullOrEmpty(filename)) return;
            // если файл существует
            if (File.Exists(Path.Combine(folderPath, filename)))
            {
                // запрашиваем разрешение на перезапись
                bool isRewrited = await DisplayAlert("Подтверждение", "Файл уже существует, перезаписать его?", "Да", "Нет");
                if (isRewrited == false) return;
            }
            // перезаписываем файл
            File.WriteAllText(Path.Combine(folderPath, filename), textEditor.Text);
            // обновляем список файлов
            UpdateFileList();
        }
        void FileSelect(object sender, SelectedItemChangedEventArgs args)
        {
            if (args.SelectedItem == null) return;
            // получаем выделенный элемент
            string filename = (string)args.SelectedItem;
            // загружем текст в текстовое поле
            textEditor.Text = File.ReadAllText(Path.Combine(folderPath, (string)args.SelectedItem));
            // устанавливаем название файла
            fileNameEntry.Text = filename;
            // снимаем выделение
            filesList.SelectedItem = null;

        }
        void Delete(object sender, EventArgs args)
        {
            // получаем имя файла
            string filename = (string)((MenuItem)sender).BindingContext;
            // удаляем файл из списка
            File.Delete(Path.Combine(folderPath, filename));
            // обновляем список файлов
            UpdateFileList();
        }
        // обновление списка файлов
        void UpdateFileList()
        {
            // получаем все файлы
            filesList.ItemsSource = Directory.GetFiles(folderPath).Select(f => Path.GetFileName(f));
            // снимаем выделение
            filesList.SelectedItem = null;
        }
    }
}

Прежде всего определим, где мы будем хранить файлы. В данном случае будем использовать локальную папку приложения для хранения данных, которая создается на устройстве и которая описывается константой Environment.SpecialFolder.LocalApplicationData. И чтобы упростить в дальнейшем операции с файлами, определяем глобальную переменную, которая хранит путь к этой папке:

string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

При загрузке срабатывает метод UpdateFileList(), который загружает названия всех файлов из папки в список ListView:

void UpdateFileList()
{
	// получаем все файлы
	filesList.ItemsSource = Directory.GetFiles(folderPath).Select(f => Path.GetFileName(f));
	// снимаем выделение
	filesList.SelectedItem = null;
}

С помощью метода Directory.GetFiles() возвращаем список всех файлов. Однако каждое название файла будет содержать полный путь с учетом всех внешних каталогов. И чтобы получить только непосредственно название файла, применяется метод Path.GetFileName, который из полного пути файла получет только его название.

Метод Save - обработчик нажатия кнопки будет проверять наличие файла. Есть файл существует, то отображается диалоговое окно с требованием подтвердить действие. Если файл не существует, то он создается, и в него заносится текст из текстового поля Editor.

Стоит учитывать, что чтобы сохранить файл именно в той папке, с который мы работаем, необходимо использовать конкатенацию пути к папке и имени файла:

Path.Combine(folderPath, filename)

Само же сохранение производится с помощью метода File.WriteAllText:

File.WriteAllText(Path.Combine(folderPath, filename), textEditor.Text);

Метод FileSelect() представляет обработчик выделения элемента в списке ListView. По выделению происходит загрузка текста в текстокое поле Editor. Для считывания текста файла применяется метод File.ReadAllText():

textEditor.Text = File.ReadAllText(Path.Combine(folderPath, (string)args.SelectedItem));

И метод Delete() является обработчиком нажатия на меню. То есть при сильном нажатии на элемент в списке ListView отображается данное контекстное меню из одного пункта, нажатие на которое приводит к удалению выделенного файла.

File.Delete(Path.Combine(folderPath, filename));
Файлы в Xamarin Forms
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850