Каждая мобильная платформа имеет свою специфику, свою файловую систему, свою структуру каталогов. Тем не менее работа с файлами и каталогами в 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));