ЛАБОРАТОРНАЯ РАБОТА 5. РАБОТА С ФАЙЛАМИ (System.IO)




Напишите WPF-приложение для поиска файлов на диске. Приложение должно искать как отдельные файлы, так и все файлы определенного типа (например, *.txt, *.jpg и т.д.). Добавьте код, использующий класс FileStream и позволяющий просматривать и редактировать файл в текстовом окне.(Открытие файла происходит при двойном клике по элементу списка)

 

Код разметки:

<Window x:Class="Laba_6A.MainWindow"

xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="https://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:Laba_6A"

mc:Ignorable="d"

Title="MainWindow" Height="800" Width="1000" ResizeMode="NoResize">

<Grid>

<!--

Каждая строка задается с помощью вложенного элемента RowDefinition, который имеет открывающий и закрывающий тег. При этом задавать дополнительную информацию необязательно. То есть в данном случае у нас определено в гриде 2 строки.

Каждый столбец задается с помощью вложенного элемента ColumnDefinition. Таким образом, здесь мы определили 2 столбца. ТО есть в итоге у нас получится таблица 2х2.

-->

<Grid.RowDefinitions>

<RowDefinition Height="0.12*"/>

<RowDefinition/>

</Grid.RowDefinitions>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="0.3*"/>

<ColumnDefinition/>

</Grid.ColumnDefinitions>

 

<StackPanel>

<TextBlock Text="Имя файла"

Margin="10"/>

<TextBlock Text="Путь к файлу"

Margin="10, 0, 10, 0"/>

</StackPanel>

 

<StackPanel Grid.Column="1" Orientation="Vertical">

<TextBox Name="obj"

Margin="10"

Text=""/>

<DockPanel Margin="10,0,10,0">

<TextBox Name="way"

Margin="0,0,10,0"

Text=""

Width="674"/>

<Button Name="view"

DockPanel.Dock="Right"

Content="Обзор"

Width="50"

Click="View_Click"/>

</DockPanel>

 

</StackPanel>

 

<StackPanel Grid.Row="1">

<CheckBox Name="findInFolders"

Margin="10"

IsChecked="True"

Content="Искать в папках"/>

<Button Name="find"

Margin="10,0,10,0"

Content="Искать"

Click="Find_Click"/>

<Button Name="Clean"

Margin="10,10,10,0"

Content="Очистить все"

Click="Clean_Click"/>

</StackPanel>

 

<TextBlock Name="tbContext"

Grid.Column="1"

Grid.Row="1"

Margin="10"

/>

 

<ListView Name="listOfFiles"

Grid.Column="1"

Grid.Row="1"

Margin="10" MouseDoubleClick="ListOfFiles_MouseDoubleClick"/>

 

 

</Grid>

</Window>

 

При копировании XAML кода не стоит забывать о пространствах имен. Здесь в качестве пространства имен указано Laba_6A, в Вашем проекто оно будет другим.

Список наденных файлов будет отображаться в элементе ListView. По двойному клику MouseDoubleClick="ListOfFiles_MouseDoubleClick" будет выбираться файл для чтения. Приведем код класса MainWindow:

 

public partial class MainWindow: Window

{

public MainWindow()

{

InitializeComponent();

}

 

// запускаем поиск по введенному пользователем шаблону

private void Find_Click(object sender, RoutedEventArgs e)

{

listOfFiles.Items.Clear();

listOfFiles.Visibility = Visibility.Visible;

tbContext.Visibility = Visibility.Hidden;

var dir = new DirectoryInfo(way.Text);

string file = obj.Text;

FindInDir(dir, file, findInFolders.IsChecked.Value);

 

if (listOfFiles.Items.Count == 0)

{

System.Windows.MessageBox.Show("Файлы не найдены");

}

}

 

// непосредственно сам поиск

private void FindInDir(DirectoryInfo dir, string pattern, bool recursive)

{

try

{

foreach (FileInfo file in dir.GetFiles(pattern))

{

listOfFiles.Items.Add(file.FullName);

}

if (recursive)

{

foreach (DirectoryInfo subdir in dir.GetDirectories())

{

FindInDir(subdir, pattern, recursive);

}

}

 

}

catch (SecurityException) { }

catch (DirectoryNotFoundException) { }

catch (UnauthorizedAccessException) { }

}

 

// получаем путь для поиска файлов

private void View_Click(object sender, RoutedEventArgs e)

{

var folderBrowser = new FolderBrowserDialog();

DialogResult result = folderBrowser.ShowDialog();

way.Text = folderBrowser.SelectedPath;

}

 

// очистка полей

private void Clean_Click(object sender, RoutedEventArgs e)

{

way.Text = string.Empty;

obj.Text = string.Empty;

tbContext.Text = string.Empty;

listOfFiles.Items.Clear();

}

 

private void ListOfFiles_MouseDoubleClick(object sender, MouseButtonEventArgs e)

{

ShowFile sf = new ShowFile(listOfFiles.SelectedItem.ToString());

sf.Show();

}

}

Чтобы в проекте был доступен FolderBrowserDialog потребуется включить следующую строку:

using System.Windows.Forms;

Помимо этого потребуется добавить ссылку на сборку System.Windows.Forms (правый клик по элементу «Ссылки» -> Добавить ссылку…):

 

 

В приведенном выше коде наибольший интерес вызывает метод ListOfFiles_MouseDoubleClick, а именно создание дочернего окна. Правой кнопкой мыши кликаем по проекту (Добавить -> Создать элемент…)

 

 

 

 

Код дополнительного окна:

 

<Window x:Class="Laba_6A.ShowFile"

xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="https://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:Laba_6A"

mc:Ignorable="d"

Title="ShowFile" Height="300" Width="300">

<Grid>

<TextBox Name="tbContent" />

</Grid>

</Window>

 

 

Код ShowFile:

public partial class ShowFile: Window

{

public ShowFile(string fileName = null)

{

InitializeComponent();

ReadText(fileName);

}

 

void ReadText(string fileName)

{

using (StreamReader sr = new StreamReader(fileName))

{

tbContent.Text = sr.ReadToEnd();

}

}

}

 

УПРАЖНЕНИЕ

1) Если запустить программу и сразу нажать на поиск, то произойдет аварийное завершение работы приложения. Допишите код таким образом, чтобы программа корректно работала при всех сценариях.

2) Замените StreamReader на FileSream как в задании.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2021-06-09 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: