Напишите WPF-приложение для поиска файлов на диске. Приложение должно искать как отдельные файлы, так и все файлы определенного типа (например, *.txt, *.jpg и т.д.). Добавьте код, использующий класс FileStream и позволяющий просматривать и редактировать файл в текстовом окне.(Открытие файла происходит при двойном клике по элементу списка)
Код разметки:
<Window x:Class="Laba_6A.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Laba_6A"
mc:Ignorable="d"
Title="MainWindow" Height="800" 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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://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 как в задании.