Раздел 2 Основы работы с файлами и директориями в C#
Глава 1 Использование контролов OpenFileDialog и SaveFileDialog для работы с файлами
Для изучения работы с контролами OpenFileDialog и SaveFileDialog создадим новое решение (подробно о создании проекта решения было раказано в первом разделе книги) или изменим уже ипользованный проект (убрав коды обработчиков событий нажатия кнопок, изменив надписи и картиночки) и поместим на форму контролы RichTextBox, OpenFileDialog и SaveFileDialog. Контролы OpenFileDialog и SaveFileDialog не визуальные и, потому, разместились ниже формы. Проект решения с которым будем работать примет вид, показанный на Рис.1.
Рис.1 Проект решения для работы с OpenFileDialog и SaveFileDialog Дважды кликнем на форме (вне контролов) и, таким образом, создадим обработчик Form1_Load, который будет вызываться при каждой загрузки формы и который в дальнейшем будем часто использовать для начальной инициализации параметров программы и переменных. В обработчике запишем код очистки RichTextBox: private void Form1_Load(object sender, System.EventArgs e) { richTextBox1.Clear(); } Обработчик нажатия кнопки 3 оставим прежний: private void button3_Click(object sender, System.EventArgs e) { Application.Exit(); } Параграф 1 Ипользование контрола OpenFileDialogОсновные свойства OpenFileDialogСвойство AddExtension разрешает или запрещает автоматическое добавление расширение, указанное в свойстве DefaultExt. Свойство DefaultExt - расширение, принятое по умолчанию для автоматического добавления к имени файла при AddExtension=true. Свойство CheckFileExists - используется для получения или устанавки значения, указывающего отображать или нет диалоговое окно предупреждения, если пользователь указал в свойстве FileName имя файла, которого не существует в данной директории и нажал кнопку "Oткрыть" при невыбранном кликом мышки файле. При CheckFileExists=true вместо прерывания будет выдано сообщение, что такого файла нет и исключения не вызывается. На Рис.2 показано окно предупреждение при FileName=a.doc, CheckFileExists=true и нажатии кнопки "Oткрыть" при невыбранном файле.
Рис.2 Окно предупреждения при CheckFileExists=true Свойство FileName - имя файла по умолчанию для выборки если была нажата кнопка OK и не выбрн кликом мышки файл в окне диалога. Свойство CheckPatchExists - используется для получения или устанавки значения, указывающего отображать или нет диалоговое окно предупреждения, если пользователь указал в свойстве FileName имя файла с несуществующим именем директории. Окно полностью анлогично показанному на Рис.2., например, при FileName=С:\3\a.doc и не выбранном файле в директории C:\ и нажатии кнопки "Oткрыть" будет выдано сообщение, поазанное на Рис.3. При CheckPatchExists=true вместо прерывания будет выдано только сообщение.
Рис.3 Окно предупреждения при CheckPatchExists=true Свойство DereferenceLinks - используется для указания контролу что именно возвращпть при выборе файла ссылки - файл по ссылке (true) или файл самой сылки (false). Свойства Filter, FilterIndex - фильтр для выбираемых файлов и индекс строки, отображаемой в окошечке "Имя файла". Например значение свойства заданного строкой при FilterIndex=1. rtf файлы (*.rtf)|*.rtf|txt файлы(*.txt)|*.txt позволит выбрать только текстовые файлы в формате rtf или txt. В окошечке "Тип файла" будет только две строки: rtf файлы (*.rtf) txt файлы(*.txt) а в окошечке "Имя файла" будет отображена первая. Свойство InitialDirectory - директория, которая выбирается при старте OpenFileDialog. Свойство MultiSelect - при значении true позволяет выбрать мышкой при нажатой кнопке Shift или Ctrl несколько файлов и сохранить их имена в свойстве FileNames в виде массива строк. Свойство ReadOnlyChecked - при значении true позволяет открывать команде OpenFile выбранные файлы только в режиме чтения. Свойство RestoreDirectory - при true диалоговое окно восстанавливает текущий каталог к первоначальному значению если пользователь изменил каталог при поиске файлов, при false - нет. Свойство работает только если закрыт поток Stream, созданный методом openFileDialog1.OpenFile(). Свойство ShowHelp - при значении true в окне диалога отображается кнопка "Справка". Свойство ShowReadOnly - при значении true в окне диалога отображается переключатель "Только для чтения". Свойство Title - заголовок диалогового окна. Свойство ValidateNames - при true проверяет допустимость имени для файла применительно к Win32. Никакое заданное по умолчанию в этом случае не добавляется. Отметим, что ве свойcтва могут быть заданы на этапе проектирования и программно - путем присвоения соответствующих значений. Загрузка содержимого файла с использованием OpenFileDialogУтановим для OpenFileDialog следующие значения свойств:
Пометим в директорию C:\ какой либо файл в формате .rtf (например который был создан в первом разделе "a.tf") и загрузим его в RichTextBox. Для этого напишем в обработчике нажатия кнопки 1 следующий код: private void button2_Click(object sender, System.EventArgs e) { string filename; //Если диалог отображен и нажата кнопка выбрать if(openFileDialog1.ShowDialog() == DialogResult.OK) { //Имя файла и директории хранитя в войстве FileName как строка filename= openFileDialog1.FileName; //Покажем имя Text=filename; //Создаем поток Stream stream = openFileDialog1.OpenFile(); //Загружаем файл в RichTextBox richTextBox1.LoadFile(stream,RichTextBoxStreamType.RichText); //Закрываем поток stream.Close(); } } Ели мы выбрали файл C:\a.rtf, то это имя отобразится в заглавии формы. Если теперь в войстве FileName запишем a.rtf, то при открытии диалога буковка "a" появляется в окошечке "Имя файла" и можно выполнить загрузку не выбирая мышкой файл, а сразу нажав кнопочку "OK". Дотаточно в войстве FileName записать a.doc и повторить то, что только что проделали выше, как получим предупреждение об отсутствии файла (см Рис.2) и файл уже придется выбирать кликом мышки (кстати, отетим еще раз, что если утановить войство CheckFileExists в false то получим возбуждение иключения). Рассмотрим еще один способ, который позволяет загружать фйлы в формате .txt. Добавим на форму контрол TextBox и установим его свойство MultiLine в true, в обработчике Form1_Load допишем строку textBox1.Text=""; а cвойству Filter присвоим значение rtf файлы (*.rtf)|*.rtf|txt файлы(*.txt)|*.txt В обработчике события нажатия кнопки 1 напишем код для чтения текстовых файлов. private void button1_Click(object sender, System.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 именно текст (см Рис.4).
Рис.4 Чтение файлов в формате .rtf(сле) и.txt(спрва) в ткстовом режиме Параграф 2 Ипользование контрола SaveFileDialogОсновные свойства SaveFileDialogСледует отметить, что все свойства отображаемые в окне Proporties для SaveFileDialog аналогичны OpenFileDialog и имеют тоже назначение и тот же принцип использования, и, поэтому, в отдельном их расмотрении нет необходимости. Сохранение информации в файл с использованием SaveFileDialogУcтановим для SaveFileDialog следующие значения свойств:
Последнее актуально именно для SaveFileDialog и позволяет не задавать в окошечке "имя файла" полное имя если файл будет сохраняться как .rtf файл. Для обработчика события нажатия кнопки 2 нпишем следующий код: private void button1_Click(object sender, System.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(); } } Еcли Вы пришли с поискового сервера - посетите мою главную страничкуНа главной странице Вы найдете программы комплекса Veles - программы для автолюбителей, программу NumberPhoto, созданную для работы с фото, сделанными цифровым фотоаппаратом, программу Локальный Web сайт - предназначенную для просмотра и прослушивания файлов большинства графических и звуковых форматов в Web Browser, программу Bricks - игрушку для детей и взрослых, программу записную книжку, программу TellMe - говорящий Русско-Английский разговорник - программу для тех, кто собирается погостить за бугром или повысить свои знания в английском, теоретический материал по программированию в среде Borland C++ builder, C# (ASP.Net). |