Вы находитесь на странице: 1из 29

Рецензия

Содержание

Введение................................................................................................................................4
1 Выполненные задания......................................................................................................5
1.1 Задание 1 - Проектирование Файлового менеджера..............................................5
1.2 Задание 2 - Разработка графического интерфейса..................................................6
1.3 Задание 3 - Разработка ПО........................................................................................6
1.4 Задание 4 - Обеспечение минимального функционала........................................10
1.5 Задание 5. Добавление основного функционала...................................................13
1.6 Задание 6 - Тестирование разработанного ПО......................................................15
2 Пример работы разработанного приложения...............................................................17
Список используемых источников...................................................................................20
Приложение A....................................................................................................................21
Листинг Form1.cs:..........................................................................................................21
Листинг Form2.cs:..........................................................................................................24
Приложение B.....................................................................................................................28
Функциональная блок-схема.........................................................................................28

2
Введение

Актуальность: Файловый менеджер – самый удобный, на данный


момент, способ взаимодействия с файлами. Он позволяет за довольно
короткое время выполнить множество операций, и что самое главное, за счёт
реализации графического интерфейса рядовому пользователю всё становится
интуитивно понятно.
Объект исследования: Файловый менеджер.
Предмет исследования: Операционная система.
Цель: закрепление и углубление теоретических знаний в области
современных операционных систем, активное применение знаний,
полученных в лекционном курсе и на лабораторных занятиях.
Задачи:
1) проектирование файлового менеджера;
2) разработка графического интерфейса;
3) разработка ПО;
4) обеспечение минимального функционала;
5) добавление основного функционала;
6) тестирование разработанного ПО;
7) формирование отчёта.

3
1 Выполненные задания
1.1 Задание 1 - Проектирование Файлового менеджера. Выбор
средств разработки и среды разработки
Используется язык программирования: C#
Мной был выбран данный язык, т.к. в сравнении с другими языками
программирования (Java, C++) разработка программы пойдёт гораздо
сложнее. В частности, разработка GUI на Java была бы более трудоемка.
Например, если использовать Swing или JavaFX, то это отнимет много
времени в первом случае и много ресурсов компьютера (память, нагрузка
процессора) во втором, а синтаксис языка С# более понятен для меня, чем С+
+.
Используемая среда разработки: Microsoft Visual Studio
Мной была выбрана эта среда разработки, так как на данный момент
времени она является наиболее подходящей платформой за счёт того, что в
нём удобно сочетаются все необходимые функции, необходимые для работы
над курсовой работой, а именно: редактор исходного кода, который включает
множество дополнительных функций, как автодополнение IntelliSense,
рефракторинг кода и т. д.; отладчик кода; редактор форм, предназначенный
для упрощённого конструирования графических интерфейсов; Среда
разработки позволяет быстро коддить. Многие из функциональных
возможностей Visual Studio направлены на то, чтобы помогать разработчику
делать свою работу как можно быстрее. В сравнении с JetBrains,
использовать WFM и встроенные библиотеки Visual Studio продуктивнее
банально из-за того, что, опять же, Intellij Idea отнимает много ресурсов.

4
Используемые фреймворки: .Net Framework 4.5.2
С помощью этого фреймворка я получу доступ к файловой системе
компьютера, а также к методам и свойствам, которые позволят производить
манипуляции с файлами и каталогами: создавать, удалять, копировать,
открывать.

1.2 Задание 2 - Разработка графического интерфейса


На данном этапе проектирования был разработан графический
интерфейс программы (рис. 1).

Рис. 1 - Графический интерфейс программы

1.3 Задание 3 - Разработка ПО


Создается корневая папка как среда работы Файлового менеджера.
Создается папка «System», содержит все необходимые файлы для работы
файлового менеджера. Так же создаются рабочие папки. Сделать основное и
контекстное меню.

5
Были созданы каталоги System и User, в которых находятся,
соответственно, файлы приложения и пользовательские файлы.
Для того, чтобы перейти в нужную директорию, можно
воспользоваться двумя путями:
1. В строке ввода пути (рис. 2) ввести адрес и нажать клавишу Enter.

Рис. 2 - Адресное поле


2. Нажать клавишу Open, сработает следующий фрагмент кода (рис. 3).

Рис. 3 - Фрагмент кода кнопки “Open”


В этой фрагменте используется класс FolderBrowserDialog для
открытия контекстного меню выбора каталога. Соответственно, если
значение метода ShowDialog() вернет нам “OK” из перечисления
DialogResult, то в метод webBrowser1.Url мы передадим тот путь, который
мы выбрали (fold.SelectedPath). После чего в адресное поле, представленное
на рис.1 будет передан путь открываемой папки.
После срабатывания кода, представленного (рис. 2), откроется
контекстное меню (рис. 4), в котором необходимо будет выбрать нужный
каталог. После нажатия кнопки «ОК» будет открыта выбранная папка.

6
7
Рис. 4 - Обзор папок
Для того, чтобы вернуться на уровень выше, необходимо нажать
кнопку «Назад» (рис. 5).

Рис. 5 - Кнопка назад


После нажатия сработает следующий фрагмент кода (рис. 6).

Рис. 6 - Фрагмент кода кнопки «Назад»


Здесь, если метод webBrowser1.CanGoBack вернёт значение true (если
есть возможность вернуться на уровень выше), вызывается метод GoBack().
Аналогично с кнопкой «Вперёд», чтобы вернуться на уровень ниже.
Для того, чтобы открыть файл, необходимо перейти в контекстное
меню Main (рис. 7) и нажать кнопку Open file.

Рис. 7 - Контекстное меню Main


Далее представлен фрагмент листинга кнопки «Open file» (рис. 8).

Рис. 8 - Фрагмент кода кнопки «Open file»


В этой фрагменте используется класс OpenFileDialog для открытия
контекстного меню выбора файла. Соответственно, если значение метода

8
ShowDialog() вернет нам “OK” из перечисления DialogResult, то мы
вызываем метод ShowDialog(); (открыть контекстное меню).
Далее, если необходимо запустить командную строку, нужно
воспользоваться в том же пункте меню кнопкой Run.
Ниже представлен фрагмент листинга кнопки «Run» (рис. 9).

Рис. 9 - Фрагмент кода кнопки «Run»


Здесь мы вызываем у класса Process метод Start и в качестве параметра
передаём программу “cmd.exe”, т.е. командную строку.
В следующем пункте контекстного меню (рис. 10) мы можем
использовать такие функции, как копирование, вставка и выделение всех
объектов в открытой директории.

Рис. 10 - Контекстное меню «Pasted»

9
Далее представлен фрагмент листинга кнопок «Copy», «Paste», «Select
all» (рис. 11).

Рис. 11 - Фрагмент кода кнопок «Copy», «Paste», «Select all»


В этих трёх методах происходит эмуляция нажатия сочетаний клавиш
Ctrl+V, Ctrl+A и Ctrl+C (вставить, выделить всё и скопировать), если
адресное поле (рис. 2) непустое.

1.4 Задание 4 - Обеспечение минимального функционала


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

10
Имеется пункт “Function” в контекстном меню “Main” (рис. 12).

Рис. 12 - Контекстное меню Main и кнопка Function


После нажатия на кнопку открывается новое окно приложения (рис.
13).

Рис. 13 - Новое окно приложения «Управление»


В пустом текстовом поле задаётся названия файла, в который будет
записана информация о работе запущенной утилиты (название процесса и
время работы)
После нажатия на кнопку, отвечающую за открытие системной
утилиты включится таймер и сработает следующий код (рис. 14) (показано на
примере msconfig – конфигурации системы):

Рис. 14 - Фрагмент кода кнопки «msconfig»


Здесь, если текстовое поле, отвечающее за название файла, в котором
будет вестись логгирование. Если поле непустое, то вызывается метода Start

11
класса Process с параметром «msconfig.exe» (предварительно в переменную
startInfo класса ProcessStartInfo мы помещаем путь до msconfig.exe).
После чего мы присваиваем глобальной переменной currentProcess это
же значение. Данная переменная отвечает за то, какая утилита сейчас
открыта. Затем присваиваем полю Enabled у timer1 значение true (запускаем
таймер) и передаем в глобальную переменную date сегодняшнее время (для
подсчёта времени выполнения утилиты).
Далее представлен листинг метода timer1_Tick (рис. 15).

Рис. 15 - Фрагмент кода таймера


Объявляется массив процессов procList, которому мы присваиваем
массив, возвращаемый методом GetProcesses() (вернуть массив работающих
в данный момент процессов). После чего заводим переменную s, куда с
помощью foreach записываем названия процессов (чтобы представить массив

12
процессов в текстовом виде). Затем поверяем, есть ли thisProcess (наша
утилита) в этом списке.
Если да, то срабатывает код для подсчёта времени выполнения. Если
нет, значит утилита закрылась и мы сохраняем информацию в файл log.txt с
помощью класса StreamWritter, а также обнуляем значение таймера и делаем
его отключенным (timer1.Enabled = false).
На скриншоте (рис. 2) представлены следующие системные утилиты:
1) Msconfig – конфигурация системы;
2) Msinfo – Сведения о системе;
3) Taskschd – Планировщик заданий;
4) Resource – Мониторинг ресурсов.

1.5 Задание 5. Добавление основного функционала


Добавить новый функционал к разработанному Файловому менеджеру
согласно варианта:
1) текущее местное время;
2) значение загрузки процессора данным процессом.
Вывод полученных данных обеспечить с возможностью обновления в
реальном времени. Возможность сохранение полученных данных в файл.

Рис. 16 – Листинг метода «Form2_Load»


При запуске нового окна активизируется новый таймер timer2 (рис. 16).
Начинает работать метод timer2_Tick (рис. 17) для того, чтобы время
обновлялось с интервалом в 1 секунду.

Рис. 17 - Метод timer2_Tick

13
В этом фрагменте мы получаем текущее время компьютера и
помещаем в переменную str. После чего присваиваем текстовому полю
labelTime значение str.
Мы получаем массив процессов с именем разрабатываемого
приложения (рис. 18). Затем, используя класс PerformanceCounter и его
конструктор в который передаём имя процесса, мы получаем значение
загрузки процессора данным приложением с помощью метода NextValue();

Рис. 18 - продолжение метода timer2_Tick


Для того, чтобы получить загрузку процессора в процентах,
необходимо узнать, сколько у него ядер. Для этого используем метод
ProcessorCount класса Enviroment. Далее, в переменной percent делаем
подсчёт. Необходимо разделить полученное значение NextValue(); на
произведение числа ядер на 10. После чего присваиваем текстовому полю
labelCPU полученное значение.

Рис. 19 - Результат работы

14
1.6 Задание 6 - Тестирование разработанного ПО
Тестовые примеры для требования

№ Что нужно Ожидаемый Результат Примечания:


выполнить: результат: работы
программы:
1 Нажать на Должно Результат -
кнопку Open и открыться окно оправдал
открыть диалога с ожидание
каталог возможностью
выбора
каталога
2 Открыть папку Открытие Результат Нужно нажать
по прямому каталога оправдал Enter для
пути с ожидание открытия
помощью
текстового поля
3 Попробовать Программа Результат Т.к. у нас
вернуться ничего не оправдал просто
назад\вперед должна сделать ожидание открылся
каталог и мы
ничего не
делали,
программе
некуда
возвращаться
4 Перейти в Должны Результат -
любую папку и вернуться либо оправдал
попробовать на уровень ожидание
ещё раз тест 2) выше, либо
ничего не
произойдёт
(если нажать
кнопку вперёд)
5 Попробовать Выделение Если фокус на Реализация
выделить все всех файлов папках – этой кнопки –
файлы сразу, результат программное
используя оправдает нажатие Ctrl+A.
функцию Select ожидания, если Аналогично,
all нет – ничего не если нажать эту
произойдёт комбинацию с
клавиатуры, то
результат будет
такой же
6 Скопировать с Должны Результат -
помощью Copy скопироваться оправдал
выделенные ожидание
файлы

15
7 Вставить с Файлы должны Если буфер -
помощью вставиться в обмена
Pasted данную непустой и
директорию фокус на
директории –
результат
оправдает
ожидания.
8 Открыть файл с Сперва Результат -
помощью Main- откроется оправдал
Open file диалоговое ожидание
окно, в котором
затем
выбирается
файл для
открытия
9 Открыть Откроется Результат -
консоль с консоль оправдал
помощью Run ожидание
10 В новом окне Ничего не Результат Необходимо
«Управление» произойдёт оправдал указать имя.
открыть ожидание
службу, не
указав имени
для лог-файла
11 Попытаться Новая служба Результат Таймер ведёт
открыть не откроется, оправдал подсчёт
несколько пока не будет ожидание времени
служб завершена исключительно
одновременно предыдущая по одной
службе.
12 По очереди В лог-файле Msconfig В лог-файл
открывать должна быть 00:00:02 записывается
службы записана название
Msinfo 00:00:04
msconfig и информация о служба – время
msinfo, после всех работы.
чего проверить запущенных
лог-файл службах во
время работы
программы

2 Пример работы разработанного приложения


Задача: открыть папку Windows, затем запустить службу msconfig и
посмотреть лог-файл.

1) открываем папку с помощью кнопки Open (рис. 20);

16
Рис. 20 – Контекстное меню «Обзор папок»

17
2) открываем окно основного функционала с помощью кнопки Main
-> Function (рис. 12);
3) вводим имя лог-файла и нажимаем Msconfig (рис. 21);

Рис. 21 – Окно «Управление»

4) как видно на скриншоте (рис. 22) – служба запустилась и начался


процесс логирования (указано в поле «Время работы службы»);

Рис. 22 – «Msconfig» и окно «Управление»

5) после закрытия службы всё удачно записалось в файл (рис. 23).

18
Рис. 23 – Лог-файл

19
Список используемых источников

1) Техническая документация, материалы по API и примеры кода


[Электронный ресурс] // хранилище документации Майкрософт для
пользователей, разработчиков и ИТ-специалистов. – 2019. – Режим доступа:
https://docs.microsoft.com/
2) Форум программистов и сисадминов [Электронный ресурс] //
форум программистов, системных администраторов, администраторов баз
данных, компьютерный форум, форум по электронике и бытовой технике,
обсуждение софта. – 2019. – Режим доступа:
http://www.cyberforum.ru/csharp-net/
3) StackOverflow на русском [Электронный ресурс] // сайт вопросов
и ответов для программистов. – 2019. – Режим доступа:
https://ru.stackoverflow.com/questions/tagged/c%23

20
Приложение A
Листинг Form1.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Collections.Specialized;

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)


{

private void btnGo_Click(object sender, EventArgs e)


{
using (FolderBrowserDialog fold = new FolderBrowserDialog()
{ Description = "select" })
{
if(fold.ShowDialog()== DialogResult.OK)
{
webBrowser1.Url = new Uri(fold.SelectedPath);
txtPath.Text = fold.SelectedPath;
}
}

21
}

private void txtPath_KeyDown(object sender, KeyEventArgs e)


{
if (e.KeyCode == Keys.Enter & txtPath.Text != "")
{
webBrowser1.Url = new Uri(txtPath.Text);
}
}

private void webBrowser1_Navigated(object sender,


WebBrowserNavigatedEventArgs e)
{
txtPath.Text = String.Format("{0}",webBrowser1.Url.LocalPath);
}

private void btnBack_Click(object sender, EventArgs e)


{
if (webBrowser1.CanGoBack)
{
webBrowser1.GoBack();
}
}

private void btnForward_Click(object sender, EventArgs e)


{
if (webBrowser1.CanGoForward)
{
webBrowser1.GoForward();
}
}

private void openFileToolStripMenuItem_Click(object sender, EventArgs e)


{
using (OpenFileDialog fold = new OpenFileDialog())
{
if (fold.ShowDialog() == DialogResult.OK)
{
fold.ShowDialog();
}
}
}

22
private void runToolStripMenuItem_Click(object sender, EventArgs e)
{
Process.Start("cmd.exe");
}

private void pasteToolStripMenuItem_Click(object sender, EventArgs e)


{
if(!txtPath.Equals(null))
SendKeys.Send("^v");
}

private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)


{
if (!txtPath.Equals(null))
{
SendKeys.Send("^a");
}

private void copyToolStripMenuItem_Click(object sender, EventArgs e)


{
if (!txtPath.Equals(null))
SendKeys.Send("^c");
}

private void functionToolStripMenuItem_Click(object sender, EventArgs e)


{
Form2 form2 = new Form2();
form2.ShowDialog();
}
}
}

23
Листинг Form2.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Timers;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
public partial class Form2 : Form, IDisposable
{
DateTime date = new DateTime();
string currentProcess;

public Form2()
{
InitializeComponent();
}

private void mscfgLoad_Click(object sender, EventArgs e)


{
if (textBox1.Text != "" && currentProcess == null)
{
ProcessStartInfo startInfo = new
ProcessStartInfo(Path.Combine(Environment.SystemDirectory, "msconfig.exe"));
Process.Start(startInfo);
currentProcess = "msconfig";
Thread.Sleep(3000);
timer1.Enabled = true;
date = DateTime.Now;
}
}

private void timer1_Tick(object sender, EventArgs e)

24
{
Process[] procList = Process.GetProcesses();
string s = "";
foreach (Process p in procList)
{
s += p.ToString();
s += " ";
}
string thisProcess = "System.Diagnostics.Process (" + currentProcess +
")";
string text = "";
string path = textBox1.Text + ".txt";
if (s.IndexOf(thisProcess) > -1)
{
TimeSpan elapsed = DateTime.Now - date;
text +=
elapsed.Hours.ToString("00") + ":" +
elapsed.Minutes.ToString("00") + ":" +
elapsed.Seconds.ToString("00");
label4.Text = currentProcess + " " + text;
}
else
{
using (StreamWriter sw = new StreamWriter(path, true))
{
sw.WriteLine(label4.Text);
}
label4.Text = "00:00:00";
currentProcess = null;
timer1.Enabled = false;
}
}

private void Form2_Load(object sender, EventArgs e)


{
timer2.Interval = 1000;
timer2.Enabled = true;
}

private void timer2_Tick(object sender, EventArgs e)


{
var str = DateTime.Now.ToString("HH:mm:ss");

25
labelTime.Text = str;

Process[] process = Process.GetProcessesByName("WindowsFormsApp1");

using (PerformanceCounter pcProcess = new PerformanceCounter("Process",


"% Processor Time", process[0].ProcessName))
{
pcProcess.NextValue();
int count = Environment.ProcessorCount;
var percent = pcProcess.NextValue() / (count * 10);
labelCPU.Text = process[0].ProcessName + " - " + Math.Round(percent,
1) + "%";
}
}

private void msinfo_Click(object sender, EventArgs e)


{
if (textBox1.Text != "" && currentProcess == null)
{
Process.Start("msinfo32.exe");
currentProcess = "msinfo32";
Thread.Sleep(1000);
timer1.Enabled = true;
date = DateTime.Now;
}
}

private void mmc_Click(object sender, EventArgs e)


{
if (textBox1.Text != "" && currentProcess == null)
{
Process.Start("taskschd.msc");
currentProcess = "mmc";
Thread.Sleep(1000);
timer1.Enabled = true;
date = DateTime.Now;
}
}

26
private void perfmon_Click(object sender, EventArgs e)
{
if (textBox1.Text != "" && currentProcess == null)
{
Process cmd = new Process();
cmd.StartInfo = new ProcessStartInfo(@"cmd.exe");
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();
cmd.StandardInput.WriteLine("perfmon /res");
currentProcess = "perfmon";
Thread.Sleep(3000);
timer1.Enabled = true;
date = DateTime.Now;
}
}
}
}

27
Приложение B
Функциональная блок-схема

28
29