Дата изменения: 8 декабря 2022
Лабораторные работы си шарп. Работа с файлами
Приложения для Windows forms
Лабораторная работа 15
Выполнить: Разработайте приложение, которое сохраняет в файл информацию из списка (ListBox) и загружает из файла информацию обратно в список.
Пример выполнения:
[Название проекта: Lesson_15Lab1
, название файла L15Lab1.cs
]
✍ Выполнение:
- Поместите на форму элементы: список ListBox (lst), ListBox (lstFromfile) текстовое поле TextBox (txt), кнопки: btnAdd («Добавить элемент в список»), btnSave («Сохранить в файле»), btnOpen («Загрузить из файла»). Расположите правильно элементы (рисунок).
- Добавьте пространство имен для работы с файлами:
- При нажатии на btnAdd («Добавить элемент в список») в список lst должна добавиться строка, записанная в текстовое окно txt, а само окно при этом должно очиститься. Добавьте код для события click кнопки btnAdd:
- По щелчку на кнопке btnSave вся информация со списка должна добавляться во введенный пользователем в текстовое окно текстовый файл. Для этого добавьте процедуру для события Click кнопки:
- Событие Click кнопки btnOpen («Загрузить из файла») запрограммируйте таким образом, чтобы в список помещались все строки из файла:
1 2 3 4 5 |
private void btnAdd_Click(object sender, EventArgs e) { lst.Items.Add(txt.Text); txt.Clear(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
private void btnSave_Click(object sender, EventArgs e) { string fileName = txtFileName.Text; // путь к файлу if (File.Exists(fileName)) { File.Delete(fileName); // если файл существует - удаляем его } using (FileStream fs = File.Create(fileName, 1024)) // класс для работы с файлами // класс для работы с данными файла в двоичной виде using(BinaryWriter bw = new BinaryWriter(fs)) { for (var i = 0; i < lst.Items.Count; i++) // пока не конец списка { bw.Write(lst.Items[i].ToString()); // записываем в файл каждый пункт } bw.Close(); fs.Close(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private void btnOpen_Click(object sender, EventArgs e) { string fileName = txtFileName.Text; lstFromfile.Items.Clear(); using (FileStream fs = new FileStream(fileName, FileMode.Open)) using (BinaryReader br = new BinaryReader(fs)) { // метод PeekChar() возвращает следующий прочитанный символ // если символов нет - возвращается -1 while (br.PeekChar() != -1) { // добавляем в список очередную прочитанную строку lstFromfile.Items.Add(br.ReadString()); } br.Close(); fs.Close(); } } |
- Запустите приложение, внесите в список lst несколько строк и попытайтесь сохранить их в файл (желательно с расширением .txt: например, proba.txt). Если не написан путь к файлу, то файл сохранится в папке /bin/Debug Вашего проекта.
These are the best and most commonly used methods for writing to and reading from files:
using System.IO;
File.AppendAllText(sFilePathAndName, sTextToWrite);//add text to existing file
File.WriteAllText(sFilePathAndName, sTextToWrite);//will overwrite the text in the existing file. If the file doesn't exist, it will create it.
File.ReadAllText(sFilePathAndName);
The old way, which I was taught in college was to use stream reader/stream writer, but the File I/O methods are less clunky and require fewer lines of code. You can type in «File.» in your IDE (make sure you include the System.IO import statement) and see all the methods available. Below are example methods for reading/writing strings to/from text files (.txt.) using a Windows Forms App.
Append text to an existing file:
private void AppendTextToExistingFile_Click(object sender, EventArgs e)
{
string sTextToAppend = txtMainUserInput.Text;
//first, check to make sure that the user entered something in the text box.
if (sTextToAppend == "" || sTextToAppend == null)
{MessageBox.Show("You did not enter any text. Please try again");}
else
{
string sFilePathAndName = getFileNameFromUser();// opens the file dailog; user selects a file (.txt filter) and the method returns a pathfilename.txt as string.
if (sFilePathAndName == "" || sFilePathAndName == null)
{
//MessageBox.Show("You cancalled"); //DO NOTHING
}
else
{
sTextToAppend = ("rn" + sTextToAppend);//create a new line for the new text
File.AppendAllText(sFilePathAndName, sTextToAppend);
string sFileNameOnly = sFilePathAndName.Substring(sFilePathAndName.LastIndexOf('\') + 1);
MessageBox.Show("Your new text has been appended to " + sFileNameOnly);
}//end nested if/else
}//end if/else
}//end method AppendTextToExistingFile_Click
Get file name from the user via file explorer/open file dialog (you will need this to select existing files).
private string getFileNameFromUser()//returns file pathname
{
string sFileNameAndPath = "";
OpenFileDialog fd = new OpenFileDialog();
fd.Title = "Select file";
fd.Filter = "TXT files|*.txt";
fd.InitialDirectory = Environment.CurrentDirectory;
if (fd.ShowDialog() == DialogResult.OK)
{
sFileNameAndPath = (fd.FileName.ToString());
}
return sFileNameAndPath;
}//end method getFileNameFromUser
Get text from an existing file:
private void btnGetTextFromExistingFile_Click(object sender, EventArgs e)
{
string sFileNameAndPath = getFileNameFromUser();
txtMainUserInput.Text = File.ReadAllText(sFileNameAndPath); //display the text
}
These are the best and most commonly used methods for writing to and reading from files:
using System.IO;
File.AppendAllText(sFilePathAndName, sTextToWrite);//add text to existing file
File.WriteAllText(sFilePathAndName, sTextToWrite);//will overwrite the text in the existing file. If the file doesn't exist, it will create it.
File.ReadAllText(sFilePathAndName);
The old way, which I was taught in college was to use stream reader/stream writer, but the File I/O methods are less clunky and require fewer lines of code. You can type in «File.» in your IDE (make sure you include the System.IO import statement) and see all the methods available. Below are example methods for reading/writing strings to/from text files (.txt.) using a Windows Forms App.
Append text to an existing file:
private void AppendTextToExistingFile_Click(object sender, EventArgs e)
{
string sTextToAppend = txtMainUserInput.Text;
//first, check to make sure that the user entered something in the text box.
if (sTextToAppend == "" || sTextToAppend == null)
{MessageBox.Show("You did not enter any text. Please try again");}
else
{
string sFilePathAndName = getFileNameFromUser();// opens the file dailog; user selects a file (.txt filter) and the method returns a pathfilename.txt as string.
if (sFilePathAndName == "" || sFilePathAndName == null)
{
//MessageBox.Show("You cancalled"); //DO NOTHING
}
else
{
sTextToAppend = ("rn" + sTextToAppend);//create a new line for the new text
File.AppendAllText(sFilePathAndName, sTextToAppend);
string sFileNameOnly = sFilePathAndName.Substring(sFilePathAndName.LastIndexOf('\') + 1);
MessageBox.Show("Your new text has been appended to " + sFileNameOnly);
}//end nested if/else
}//end if/else
}//end method AppendTextToExistingFile_Click
Get file name from the user via file explorer/open file dialog (you will need this to select existing files).
private string getFileNameFromUser()//returns file pathname
{
string sFileNameAndPath = "";
OpenFileDialog fd = new OpenFileDialog();
fd.Title = "Select file";
fd.Filter = "TXT files|*.txt";
fd.InitialDirectory = Environment.CurrentDirectory;
if (fd.ShowDialog() == DialogResult.OK)
{
sFileNameAndPath = (fd.FileName.ToString());
}
return sFileNameAndPath;
}//end method getFileNameFromUser
Get text from an existing file:
private void btnGetTextFromExistingFile_Click(object sender, EventArgs e)
{
string sFileNameAndPath = getFileNameFromUser();
txtMainUserInput.Text = File.ReadAllText(sFileNameAndPath); //display the text
}
rrssrr 0 / 0 / 0 Регистрация: 22.05.2015 Сообщений: 5 |
||||
1 |
||||
Запись в файл данных с формы23.05.2017, 14:24. Показов 9747. Ответов 8 Метки нет (Все метки)
Добрый день! Подскажите пожалуйста, как написать рабочий код. У меня 3 Radiobutton — это варианты ответов на вопросы, который выводятся поочередно в Label. Программа считывается вопросы из файла рандомно — они почти никогда не повторяются. Мне нужно чтобы все вопросы, которые отобразила программа на форме, а также выбранный ответ и правильный ответ — записывались в файл в том же порядке, что и выводятся они на форме.
__________________
0 |
106 / 94 / 66 Регистрация: 21.04.2014 Сообщений: 1,337 |
|
23.05.2017, 15:15 |
2 |
rrssrr, может не стоит заморачиваться с hashset , а в файл просто записывать строку в формате ВОПРОС|1|3, а потом её парсить (первое число после знака | — это выбранный ответ, второе — правильный.)
0 |
0 / 0 / 0 Регистрация: 22.05.2015 Сообщений: 5 |
|
23.05.2017, 15:29 [ТС] |
3 |
А можно пожалуйста пример? Добавлено через 10 минут
в файл просто записывать строку в формате ВОПРОС|1|3
0 |
FaceHoof 106 / 94 / 66 Регистрация: 21.04.2014 Сообщений: 1,337 |
||||
23.05.2017, 15:30 |
4 |
|||
Сообщение было отмечено rrssrr как решение Решениеrrssrr, можно.
Вместо «|» можно использовать любой символ. Лишь бы его не было в вопросе.
2 |
0 / 0 / 0 Регистрация: 22.05.2015 Сообщений: 5 |
|
23.05.2017, 15:31 [ТС] |
5 |
Спасибо, сейчас попробую
0 |
FaceHoof 106 / 94 / 66 Регистрация: 21.04.2014 Сообщений: 1,337 |
||||
23.05.2017, 15:37 |
6 |
|||
Сообщение было отмечено rrssrr как решение Решениеrrssrr, ах да, чтобы данные именно дописывались в файл, можно запись в него сделать таким образом:
1 |
0 / 0 / 0 Регистрация: 22.05.2015 Сообщений: 5 |
|
23.05.2017, 15:43 [ТС] |
7 |
Да, работает, но записывает только 1 строку: Вопрос |3|2| А должно быть 15 таких строк, только с разными вопросами и соответствующими ответами.
0 |
106 / 94 / 66 Регистрация: 21.04.2014 Сообщений: 1,337 |
|
23.05.2017, 15:53 |
8 |
rrssrr, смотри сообщение выше. Чтобы писалось несколько строк надо немного поменять способ записи.
0 |
0 / 0 / 0 Регистрация: 22.05.2015 Сообщений: 5 |
|
23.05.2017, 15:58 [ТС] |
9 |
Огромное Вам спасибо! Всё получилось!
0 |
Опция сохранения на компьютере распространена повсюду. Бывает что создавая приложение необходимо, чтобы оно обладало данной функцией.
Создание приложения на C# и Windows Form при использовании Visual Studio достаточно простая задача. (ссылка) Но что если нам понадобится вызвать из приложения окно сохранения. И в сегодняшней статье мы создадим простое приложение Windows Form, рассмотрим как записать данные в файл и в конце добавим окно сохранения.
Для начала создадим новое приложение, так как это описано в одной из статей.
Далее вкладка ВИД > панель элементов. Выбираем элемент Button и помещаем его на форму.
Затем добавим один элемент RichTextBox, принимающий пользовательский ввод. Кнопка сохранения будет помещать введенный текст в указанное место на компьютере.
Результат:
Название на кнопке изменено в окне свойств. Правая кнопка > свойства. Находим поле текст.
Дважды щелкаем по элементу Button. В результате получаем обработчик нажатия. Внутри которого объявляется строковая переменная, которой присваивается текст полученный в элементе RichTextBox.
Для простоты выведем его в новое окно через MessageBox.
private void button1_Click(object sender, EventArgs e)
{
string text = richTextBox1.Text;
MessageBox.Show(text);
}
Для открытия окна сохранения используем класс SaveFileDialog.
private void button1_Click(object sender, EventArgs e)
{
string text = richTextBox1.Text;
MessageBox.Show(text);
SaveFileDialog open = new SaveFileDialog();
// открываем окно сохранения
open.ShowDialog();
// присваниваем строке путь из открытого нами окна
string path = open.FileName;
try{
// создаем файл используя конструкцию using
using(FileStream fs = File.Create(path))
{
// создаем переменную типа массива байтов
// и присваиваем ей метод перевода текста в байты
byte[] info = new UTF8Encoding(true).GetBytes(text);
// производим запись байтов в файл
fs.Write(info, 0, info.Length);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
В данном коде используется конструкция using, для безопасного открытия потока на запись с последующим его закрытием. Данная конструкция автоматизирует освобождение ресурсов памяти.
Таким образом мы создали, простое оконное приложение Windows Form на C#, с функцией записи в файл и его сохранением.
-
Создано 07.04.2022 10:00:30
-
Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
Она выглядит вот так:
-
Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
Лабораторная работа №5
Основы работы с файлами в C# с использованием Windows Forms.
1. Цель
ознакомиться с компонентами и методами работы с файлами в С# c использованием Windows Form в простых Windows приложениях. Ознакомится с свойствами и методами контролов OpenFileDialog и SaveFileDialog, а так же с классами File, Path,
FileSystemInfo, FileInfo.
2.Методические указания
1.При изучении языка программирования С# будет использоваться интегрированная среда разработки программного обеспечения Microsoft Visual Studio Express 2013 для Windows Desktop. Будут использованы основные элементы .NET Framework и связь С# с элементами платформы .NET.
2.По окончанию работы сохраните все созданные файлы на своих носителях.
3.Защита лабораторной работы производится только при наличии электронного варианта работающего скрипта.
3.Теоретические сведения
Для изучения работы с контролами OpenFileDialog и SaveFileDialog создадим новое решение и поместим на форму контролы RichTextBox, OpenFileDialog и SaveFileDialog. Контролы OpenFileDialog и SaveFileDialog не визуальные и, потому,
разместились ниже формы. Проект решения, с которым будем работать примет вид, показанный на Рис.5.1.
Рис.5.1 Проект решения для работы с OpenFileDialog и SaveFileDialog
Дважды кликнем на форме (вне контролов) и, таким образом, создадим, обработчик Form1_Load, который будет вызываться при каждой загрузки формы и который в дальнейшем будем часто использовать для начальной инициализации параметров программы и переменных. В обработчике запишем код очистки
RichTextBox:
private void Form1_Load(object sender, System.EventArgs e)
{
richTextBox1.Clear();
}
Использование контрола OpenFileDialog
Основные свойства OpenFileDialog:
1.Свойство AddExtension разрешает или запрещает автоматическое добавление расширения, указанное в свойстве DefaultExt.
2.Свойство DefaultExt — расширение, принятое по умолчанию для автоматического добавления к имени файла при AddExtension=true.
3.Свойство CheckFileExists — используется для получения или установки значения, указывающего отображать или нет диалоговое окно предупреждения, если пользователь указал в свойстве FileName имя файла, которого не существует в данной директории и нажал кнопку «Oткрыть» при невыбранном кликом мышки файле. При CheckFileExists=true вместо прерывания будет выдано сообщение, что такого файла нет и исключения не вызывается. На Рис.5.2. показано окно предупреждение при FileName=a.doc, CheckFileExists=true и нажатии кнопки «Oткрыть» при невыбранном файле.
Рис.5.2 Окно предупреждения при CheckFileExists=true
4.Свойство FileName — имя файла по умолчанию для выборки, если была нажата кнопка OK и не выбранкликом мышки файл в окне диалога.
5.Свойство CheckPatchExists — используется для получения или установки значения, указывающего отображать или нет диалоговое окно предупреждения, если пользователь указал в свойстве FileName имя файла с несуществующим именем директории.
6.Свойство DereferenceLinks — используется для указания контролу, что именно возвращать при выборе файла ссылки — файл по ссылке (true) или файл самой ссылки(false).
7.Свойства Filter, FilterIndex — фильтр для выбираемых файлов и индекс строки, отображаемой в окошечке «Имя файла». Например, значение свойства заданного строкой при FilterIndex=1.
rtf файлы (*.rtf)|*.rtf|txt файлы(*.txt)|*.txt
позволит выбрать только текстовые файлы в формате rtf или txt. В окошечке «Тип файла» будет только две строки:
rtf файлы (*.rtf) txt файлы(*.txt)
а в окошечке «Имя файла» будет отображена первая.
8.Свойство InitialDirectory — директория, которая выбирается при старте
OpenFileDialog.
9.Свойство MultiSelect -при значении true позволяет выбрать мышкой при нажатой кнопке Shift или Ctrl несколько файлов и сохранить их имена в свойстве FileNames в виде массива строк.
10.Свойство ReadOnlyChecked — при значении true позволяет открывать команде OpenFile выбранные файлы только в режиме чтения.
11.Свойство RestoreDirectory — при true диалоговое окно восстанавливает текущий каталог к первоначальному значению, если пользователь изменил каталог при поиске файлов, при false -нет. Свойство работает только,если закрыт поток Stream, созданный методом openFileDialog1.OpenFile().
12.Свойство ShowHelp — при значении true в окне диалога отображается кнопка «Справка».
13.Свойство ShowReadOnly -при значении true в окне диалога отображается переключатель «Только для чтения».
14.Свойство Title -заголовок диалогового окна.
15.Свойство ValidateNames — при true проверяет допустимость имени для файла применительно к Win32. Заданное по умолчанию в этом случае не добавляется.
Отметим, что все свойства могут быть заданы на этапе проектирования и программно — путем присвоения соответствующих значений.
Загрузка содержимого файла с использованием OpenFileDialog
Установим для OpenFileDialog следующие значения свойств:
Filter -txt файлы (*.txt)|*.txt
InitialDirectory -C:temp
Поместим в директорию C:temp какой либо файл в формате *.txt и загрузим его в RichTextBox. Для этого напишем в обработчике нажатия кнопки 1 следующий код:
using System.IO;
private void button1_Click(object sender, EventArgs e)
{
string filename;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
filename = openFileDialog1.FileName; MessageBox.Show(filename);
Text = filename;
Stream stream = openFileDialog1.OpenFile(); richTextBox1.LoadFile(stream, RichTextBoxStreamType.PlainText); stream.Close();
}
}
Если мы выбрали файл C:*.txt, то это имя отобразится в заглавии формы. Если теперь в свойстве FileName запишем *.txt, то при открытии диалога название «*» появляется в окошечке «Имя файла» и можно выполнить загрузку не выбирая мышкой файл, а сразу нажав кнопочку «OK». Достаточно в свойстве FileName записать a.doc и повторить то, что только что проделали выше, как получим предупреждение об отсутствии файла (см Рис.5.2.) и файл уже придется выбирать кликом мышки (кстати, отметим еще раз, что если установить свойство CheckFileExists в false то получим возбуждение исключения).
Рассмотрим еще один способ, который позволяет загружать файлы в формате .txt. Добавим на форму контрол TextBox и установим его свойство MultiLine в true, в обработчике Form1_Load допишем строку textBox1.Text=»»; а свойствуFilter присвоим значение rtf файлы (*.rtf)|*.rtf|txt файлы(*.txt)|*.txt
В обработчике события нажатия кнопки 1 напишем код для чтения текстовых файлов.
private void button2_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = «rtf файлы(*.rtf)|*.rtf|txt файлы(*.txt)|*.txt»;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
System.IO.StreamReader streamReader;
streamReader = new System.IO.StreamReader(openFileDialog1.FileName);
richTextBox1.Text = streamReader.ReadToEnd(); streamReader.Close();
//Можно указатькодировку вывода отличную от кодировке по умолчанию
streamReader = new System.IO.StreamReader(openFileDialog1.FileName, System.Text.Encoding.GetEncoding(«windows-1252»));
textBox1.Text = streamReader.ReadToEnd(); streamReader.Close();
}
}
Ели прочитаем текстовый файл в формате .rtf, то увидим уже знакомое нам по первому разделу содержимое файла, а при чтении текстового файла в формате .txt именно текст (см Рис.5.4).
Рис.5.4. Чтение файлов в формате .rtf(слева) и.txt(справа) в текстовом режиме
Использованиеконтрола SaveFileDialog
Основные свойства SaveFileDialog, отображаемые в окне Properties для SaveFileDialog аналогичны OpenFileDialog и имеют тоже назначение и тот же принцип использования, и, поэтому, в отдельном их рассмотрении нет необходимости.
Сохранение информации в файл с использованием SaveFileDialog: Установимдля SaveFileDialog следующие значения свойств:
Filter -rtf файлы (*.rtf)|*.rtf|txt файлы(*.txt)|*.txt
InitialDirectory -C:
DefaultExtension -rtf
Последнее актуально именно для SaveFileDialog и позволяет не задавать в окошечке «имя файла» полное имя,если файл будет сохраняться как .rtf файл. Для обработчика события нажатия кнопки 2 напишемследующий код:
private void button3_Click(object sender, EventArgs e)
{
MemoryStream memorystream = new System.IO.MemoryStream(); Stream filestream;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//ассоциируем поток с именем файла -если файла нет создаем filestream = saveFileDialog1.OpenFile(); memorystream.Position = 0;
//сохраняем в поток содержимоеrichTextBox1 richTextBox1.SaveFile(memorystream, RichTextBoxStreamType.PlainText);
//переносим в файл информацию и закрываем поток memorystream.WriteTo(filestream); filestream.Close();
}
}
Для записи в формате .txt обычно используется StreamWriter, как это мы уже делали в предыдущем разделе (не забудем также подключить using System.IO;).
private void button1_Click(object sender, System.EventArgs e)
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamWriter streamwriter =
new System.IO.StreamWriter(saveFileDialog1.FileName, false, System.Text.Encoding.GetEncoding(«utf-8»));
//ИзTextBox streamwriter.Write(this.textBox1.Text);
//Из RihTextBox -если убрать слэши -оба //текста контролов будут в одном файле
//streamwriter.Write(this.richTextBox1.Text);
streamwriter.Close();
}
}
РАБОТА С ФАЙЛАМИ В С#
Для изучения данного вопроса будем использовать проект решения предыдущего параграфа, убрав коды обработчиков событий нажатия кнопок. Контролы RichTextBox, TextBox, OpenFileDialog и SaveFileDialog нам пока не мешают и будут полезны в дальнейшем. Обработчик нажатия кнопки 3 и функцию Form1_Load оставим прежними.
Пространство имен System.IO
В библиотеки .NET Framework более чем 2500 классов. Все они является потомками класса System.Object. При объявлении класса обычно не указывается System.Object (это добавляется по умолчанию), хотя это и можно сделать и явно:
class MyClass:System.Object
{
…
}
Все классы сгруппированы по пространствам имен. Пространство имен System.IO (Рис.5.6) содержит классы и типы данных, используемые для работы (чтение и запись) с потоками и файлами и файловой системой.
Рис.5.6 Пространство имен System.IO
Классы Directory и File являются прямыми потомками класса Object и содержат статические методы для выполнения различных операций с папками и файлами (создание, удаление, проверка существования, и т. п.).
Класс Path -прямой потомок класса Object содержат статические методы для работы
спутями и именами файлов.
Классы BinaryReader и BinaryWriter, также прямые наследники класса Object,
содержат статические методы для чтения и записи примитивных типов данных как бинарных значений. Он содержит методы для каждого типа (ReadBoolean, ReadByte,
ReadBytes, ReadChar, ReadChars, ReadDecimal, ReadDouble и т.д.).
Классы DirectoryInfo и FileInfo — потомками абстрактного класса FileSystemInfo содержат не статические методы для выполнения операций с папками и файлами (создание, удаление, проверка существования, и т. п.). Для использования данных
классов |
требуется |
создатьих экземпляры. |
Классы FileInfo и DirectoryInfo |
являются |
|
«запечатанными» классами (sealed classes) |
-мы |
можем |
создавать экземпляры этих |
||
классов, но наследовать от них невозможно. |
|||||
Класс |
Stream |
— наследник абстрактного |
класса |
MarhalByRefObjekt |
-также |
абстрактный класс, обеспечивающий представление последовательности байтов. Классы наследники класса Stream, обеспечивают функции для работы с файлами (класс FileStream), памятью (класс MemoryStream) и дают возможность создать буфер в памяти для буферизованных потоковых операций чтения и записи(BufferedStream). Потоки поддерживают операции чтения, записи, а также операции позиционирования.
Классы TextReader и TextWriter используется для чтения и записи последовательности символов потоков. Их наследники StreamReader, StringReader, StreamWriter, StringWriter обеспечивают возможность чтения и записи строк и символов в строках.
Класс File и его использование
Класс File содержит набор статических методов, которые могут быть использованы для создания, открытия, копирования, удаления и перемещения файлов. Некоторые из методов класса File (например Create()) создают объекты типа FileStream или StreamWriter. При рассмотрении методов класса мы пока не будем заострять внимание на возможных прерываниях при использовании методов класса (об этом более подробно при рассмотрении методов класса FileInfo — прерывания у методов обоих классов идентичны). Рассмотрим основные метода класса:
Delete(string path) — удаляет файл c именем и в каталоге, определенным path.
Exists(string path) — проверяет наличие файла в указанном каталоге -при наличии файла возвращает true.
Create(string path), или Create (string path, int bufersize), используется для создания файла c именем и в каталоге, определенным path и с указанным размером буфера. Методы возвращают объект типа FileStream. Исключение возникает, если диск закрыт для записи.
private void button1_Click(object sender, System.EventArgs e)
{
//Символ @ блокирует использование косой черты //как маркера начала спецсимвола
string path = @»c:a.txt»;
//Испрользование методов Exists() и Delete() if(File.Exists(path))
{
File.Delete(path);
}
//Создаем файл и объект streamwriter, который будет //существовать до закрытия фигурной скобки using(FileStream filestream = File.Create(path, 1024))
{ |
||||
Byte[] text |
= new |
UTF8Encoding(true).GetBytes(«Текст, |
который |
|
будет |
записан |
в |
||
файл»); |
||||
filestream.Write(text, 0, text.Length); |
||||
} |
||||
} |
||||
Open(string |
path, FileMode |
mode, FileAccess acess, FileShare share) — |
открывает |
файл по указанному пути, с указанным режимом чтения, записи и доступа для чтения — записи и указанной опцией совместного использования. При открытии создает объект типа FileStream. Обязательными параметрами являются только первые
два.
private void button1_Click(object sender, System.EventArgs e)
{
//Символ @ блокирует использование косой черты //как маркера начала спецсимвола
string path = @»c:c.txt»;
//Открываем файл и создаем объект filestream, который будет //существовать до закрытия фигурной скобки
using(FileStream filestream = File.Open(path,FileMode.Open,FileAccess.ReadWrite,FileShare.ReadWrite))
{
byte[] bText = new byte[1024]; UTF8Encoding text = new UTF8Encoding(true);
while(filestream.Read(bText,0,bText.Length) > 0)
{
richTextBox1.AppendText(text.GetString(bText)+»rn»);
}
try
{
using(FileStream filestream2
= File.Open(path,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
{
Text=»Файл открыт дважды.»;
}
}
catch(Exception ex)
{
string message=ex.Message;
Text=»Файл не может быть открыт дважды.»;
}
}
Данный фрагмент при опции совместного использования при FileShare.None
выведет в заголовок текст
Text=»Файл не может быть открыт дважды.»;
а при FileShare.ReadWrite для обоих методов Open (опция может быть только
одна и также)
Text=»Файл открыт дважды.»;
CreateText(string path) создает файл, который будет открыт для записи. Метод возвращает объект типа StreamWriter, который может быть использован для
записи текста в файл. Исключение возникает, если диск закрыт для записи.
private void button1_Click(object sender, System. EventArgs e)
{
//Символ @ блокирует использование косой черты //как маркера начала спецсимвола
string path = @»c:a.txt»;
//Метод Exists -проверяет наличие файла if(!File.Exists(path))
{
//Создаем файл и объект streamwriter, который будет
//существовать до закрытия фигурной скобки using(StreamWriter streamwriter = File.CreateText(path))
{
streamwriter.WriteLine(«Строка 1»); streamwriter.WriteLine(«Строка 2»); streamwriter.WriteLine(«Строка 3»);
}
}
}
OpenText(string path) используется для открытия существующего текстового файла
и создания объекта типа StreamReader:
private void button2_Click(object sender, System.EventArgs e)
{
using(StreamReader streamreader = File.OpenText(path))
{
string sString = «»;
while((sString = streamreader.ReadLine()) != null)
{
richTextBox1.AppendText(sString+»rn»);
}
}
}
На данном этапе можно запустить приложение с кодами обработчиков для кнопки 2 и одного из предыдущих пунктов для кнопки 1 и убедиться в действенности методов.
AppendText(string path) создает объект типа StreamWriter, который можно использовать для добавления текста в кодировке UTF-8 в конец файла. Добавим код добавления строк в конец фала к коду обработчика нажатия кнопки 1, код обработчика для кнопки 2 оставим прежним и убедимся в действенности метода,
выполнив приложение:
private void button1_Click(object sender, System.EventArgs e)
{
//Символ @ блокирует использование косой черты //как маркера начала спецсимвола
string path = @»c:a.txt»;
//Метод Exists -проверяет наличие файла if(File.Exists(path))
{
//Удаляем старый файл
File.Delete(path);
}
if(!File.Exists(path))
{
//Создаем файл и объект streamwriter, который будет //существовать до закрытия фигурной скобки using(StreamWriter streamwriter = File.CreateText(path))
{
streamwriter.WriteLine(«Строка 1»); streamwriter.WriteLine(«Строка 2»); streamwriter.WriteLine(«Строка 3»);
}
}
using(StreamWriter streamwriter = File.AppendText(path))
{
streamwriter.WriteLine(«Строка 4»); streamwriter.WriteLine(«Строка 5»); streamwriter.WriteLine(«Строка 6»);
}
}
void Copy(string sourepath,string destpatch,bool overwrite) – копирует существующий файл по новому адресу. При overwrite=false перезапись файла при его наличии не происходит.
void Move(string sourepath,string destpatch) — переносит существующий файл по новому адресу. Примеры использования методов Copy и Move:
private void button1_Click(object sender, System.EventArgs e)
{
//Создание пустой файла – можно без Using, но тогда надо закрыть поток
FileStream filestream=File.Create(«C:\a.txt»);
//Закрыть — иначе файл заблокирован filestream.Close();
//Или так
//using(FileStream filestream=File.Create(«C:\a.txt»)){}
//Перенос файла a.txt в b.txt File.Move(«C:\a.txt»,»C:\b.txt»);
//Проверка существования файла if(File.Exists(«C:\b.txt»))
{
//Копирование файла
File.Copy(«C:\b.txt»,»C:\d.txt»);
//Удаление файла
File.Delete(«C:\b.txt»);
}
}
SetAttributes(string path,FileAttributes) и GetAttributes(path) -позволяют установить и получить значение атрибутов файлов. Атрибуты файлов имеют тип FileAttributes. Структура типа -набор бит (например двоичные значения для ReadOnly -1, Hidden -2, System -4 и т.д.). Возможны следующие значения атрибутов:
Archive -файл готов к архивированию или к удалению;
Compressed -упакованный файл;
Device -резерв, пока не используется;
Directory -каталог;
Encrypted -файл зашифрован;
Hidden -скрытый файл;
Normal -у файла не установлены никакие атрибуты;
NotContentIndexed — файл не индексируется системой Windows Indexing System;
Offline -содержимое файла не доступно в режиме офлайн;
ReadOnly -только для чтения;
ReparsePoint — файл содержит блок данных, ассоциированных с файлом или каталогом;
SparsePoint — файл содержит большой объем пустых данных;
System — файл операционной системы или используется ОС.
Temporary — файл является временным файлом, созданным либо операционной системой, либо какой либо программой.
Следующий код показывает основные возможности по работе с атрибутами:
private void button1_Click(object sender, System.EventArgs e)
{
//Создание пустой файла string path=@»C:a.txt»; if (!File.Exists(path))
{