> For the complete documentation index, see [llms.txt](https://lessons.sannybuilder.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lessons.sannybuilder.com/00300/00100/000150.-podklyuchaem-dll-biblioteku-rabota-s-failami.md).

# 000150. Подключаем dll-библиотеку, работа с файлами

Подключаем dll-библиотеку, работа с файлами||wmysterio|wmysterio|<wmysterio@yandex.ru>|/||Всем хай! Мы продолжаем делать наш браузер, и сегодня нам предстоит сделать Лог последних посещаемых сайтов. Для этого удобнее будет использовать специальную библиотеку классов, которая будет выполнять действия, связанных с Лог'ом. Создадим новый проект в диспетчере проектов. Для этого выделите текущий проект, **ПКМ -> Добавить -> Создать проект**:\
[![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/s24265069.jpg)](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/24265069.png)\
В открывающимся окне выберите "Библиотека классов" и укажем ему имя **BrowserLib**:\
![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/07302869.png)\
Нажимает "**Ок**". Мы создали проект, который пока пустой и не содержит нужного функционала. Чтобы мы могли использовать эту библиотеку, мы должны сохранить её. Нажимаем на иконку дискеток:\
[![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/s43327562.jpg)](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/43327562.png)\
Переименуем наш класс на более понятое название, например: **BrowserLog**. Чтобы это было быстрее, достаточно в окне проекта выделить наш класс и нажать клавишу F2, которая уже давно в ОС Windows является горячей клавишей "переименовать":\
![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/42212840.png)\
нажимаем мышью где-либо и у нас появится сообщение: "Идет переименование файла..."\
[![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/s63947792.jpg)](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/63947792.png)\
Соглашаемся на эту процедуру и все ссылки на это имя класса будут переименованы во всём проекте. Теперь мы можем приступать к написанию этой dll-ки.\
\
С чего начать? Ну раз класс, по-идеи, должен сохранять последние ссылки, то они должны где-то хранится. По-этому, как вариант, я предлагаю их хранить в файле, заодно и изучим работу с ними :)\
\
Создадим в проекте библиотеки новый файл, для этого в BrowserLib нажимаем **ПКМ ->Добавить->Создать элемен**т:\
[![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/s60434137.jpg)](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/60434137.png)\
Более простой вариант - горячие клавиши CTRL+SHIFT+A.\
В появившемся окне, выбираем "**Текстовый файл**", указываем ему имя "**Log.txt**" и нажимаем "**Ок**":\
[![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/s43133982.jpg)](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/43133982.png)\
Мы прикрепили файл к нашему проекту, но нужно сделать ещё одну манипуляцию - автоматически создаваемый файл при компиляции проекта. Для этого выберем созданный текстовый файл и нажмём свойства и укажем полю "Копировать в выходной каталог" применим пункт "Всегда копировать":\
\
![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/06149403.png)\
Сохраняем проект и переходим к редактированию кода библиотеки.\
\
Чтобы работать с файлами, нам необходимо подключить библиотеку. Пишем:<br>

| <p>using System.IO;<br></p> |
| --------------------------- |

Чтобы не геммороиться с созданием объектов этого класса, предлагаю сделать 2 статичных метода, которые будут записывать и читать файл. Начнём с записи в файл:\
1\) Создадим метод "AddMessage", который будет добавлять запись в Лог:

| <p>public static void AddMessage( string Text ) {<br>        // Здесь будет код!<br>}<br></p> |
| --------------------------------------------------------------------------------------------- |

Далее идёт непосредственно сам процесс записи. Структуру файла я предлагаю сделать такой:

\| <p>ДАТА\_СОЗДАНИЯ<strong>|</strong>ТЕКСТ<br></p> |
\| ----------------------------------------------- |

Чтобы мы могли легко читать данные с файла я отделил текст и дату сепаратором "|". А сам процесс записи такой:

| <p>File.AppendAllText( "Log.txt", Text + "\r\n" );<br></p> |
| ---------------------------------------------------------- |

Вначале указывается путь к файлу. Так как как файл автоматически будет создаваться в директории с программой, то ничего лишнего сюда добавлять не понадобилось. После этого указывается строка, которая будет дописана в файл. Чтобы отделить строки, я добавил к тексту ещё и перенос строки **\r**.\
\
ВАЖНО! Символ "" в c# поддерживается частично и данном случаи он не будет переносить строки.\
\
Чтобы записать ещё и дату, нужно воспользоваться структурой **DateTime**. Процесс получения текущей даты выглядит следующим образом:

| <p>DateTime.Today.ToShortDateString()<br></p> |
| --------------------------------------------- |

Чтобы обезопасить себя от исключений и ошибок влепим этот код в блок try. Сама процедура будет содержать такой код:

\| <p>try {<br>    File.AppendAllText( "Log.txt", DateTime.Today.ToShortDateString() + "|" + Text + "\r\n" );<br>} catch { return; }<br></p> |
\| ----------------------------------------------------------------------------------------------------------------------------------------- |

Таким образом, если каким-то макаром файл не удастся открыть, то процесс записи будет пропущен.\
\
Процесс чтения.\
Начнём с того, как написать метод? Прежде всего Есть метод,  который возвращает массив строк и выглядит он таким образом:

| <p>File.ReadAllLines( "Log.txt" );<br></p> |
| ------------------------------------------ |

Таким образом можно сформировать такой статический метод:

| <p>public static string\[] GetMessages() {<br>   // Здесь будет процесс чтения<br>}<br></p> |
| ------------------------------------------------------------------------------------------- |

Нужно также помнить, что если файла не существует, то программа вызовет исключение по данному поводу и приведёт к краху браузера, по этому этот код лучше заточить в блок try. Весь метод будет віглядить так:

| <p>public static string\[] GetMessages() {<br>   try {<br>      return File.ReadAllLines( "Log.txt" );<br>   } catch { return null; }<br>   return Lines;<br>}<br></p> |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

Если файл не удастся открыть, то метод возвратит null. Компилируем нашу библиотеку (клавиша **F6**) и сохраняем проект.\
\
Нам осталось только применить нашу библиотеку и посмотреть работает ли она :)\
Переходим в проект браузера и в обработчике событий кнопки добавим код:

| <p>        private void button1\_Click( object sender, EventArgs e ) {<br>            try {<br>                webBrowser1.Url = new Uri( textBox1.Text );<br>                BrowserLog.AddMessage( textBox1.Text );<br>                label1.Text = "";<br>            } catch {<br>                label1.Text = "Неверное имя ссылки!";<br>            }<br>        }<br></p> |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

Чтобы компилятор видел нашу процедуру, нам необходимо включить её в проект. Для этого переходим в **Управление проектом, Ссылки ->ПКМ->Добавить ссылку**:\
![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/98741504.png)\
В открывающемся окне выбираем вкладку "**Проекты**"\
[![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/s27122640.jpg)](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/27122640.png)\
Выбираем созданный ранее проект библиотеки и нажимаем "**Ок**". Теперь нам нужно подключить её программно:

| <p>using BrowserLib;<br></p> |
| ---------------------------- |

Всё, можно делать тест! Я перешел по 4-м разным сайтам и открыт файл "Log.txt", который находился в папке "WebForm\bin\Debug" и получил следующий результат:\
[![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/s44644833.jpg)](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/44644833.png)\
Все ссылки успешно записались в Лог-файл!\
\
Что-же, на этом пожалуй окончу урок. В следующем мы рассмотрим такие темы, как вызов другой формы из первой, компонент ListBox. Встретимся в новом уроке ;)\
|1598|1|0|24265069`png`624`144`400`92\|07302869`png`275`191|43327562`png`587`258`400`175\|42212840`png`199`77|63947792`png`499`173`400`138\|60434137`png`833`162`400`77|43133982`png`481`132`400`109\|06149403`png`303`135|98741504`png`254`79\|27122640`png`473`223`399`188|44644833`png`600`202`400\`134||podkljuchaem\_dll\_biblioteku|1392773268
