# 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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00300/00100/000150.-podklyuchaem-dll-biblioteku-rabota-s-failami.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
