Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №5

.pdf
Скачиваний:
35
Добавлен:
26.03.2015
Размер:
668.31 Кб
Скачать

Лабораторная работа №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)+"\r\n");

}

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+"\r\n");

}

}

}

На данном этапе можно запустить приложение с кодами обработчиков для кнопки 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))

{