Лабораторная работа 5. Работа с файлами (system. Io)

Напишите 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 как в задании.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: