Следующий фрагмент кода описывает как можно создать поддиректорию MySub в директории Sub:
DirectoryInfo dir = new DirectoryInfo(@"F:\WINNT");
try
{
dir.CreateSubdirectory("Sub");
dir.CreateSubdirectory(@"Sub\MySub");
}
catch(IOException e)
{
Console.WriteLine(e.Message);
}
Создание файлов при помощи класса FileInfo
Класс FileInfo позволяет создавать новые файлы, получать информацию, удалять и перемещать их. В этом классе также есть методы для открытия, чтения и записи в файл. В следующем примере показано, как можно создать текстовый файл и получить доступ к его информации (времени его создания, полное имя, и так далее):
FileInfo fi = new FileInfo(@"F:\Myprogram.txt");
FileStream fstr = fi.Create();
Console.WriteLine("Creation Time: {0}",f.CreationTime);
Console.WriteLine("Full Name: {0}",f.FullName);
Console.WriteLine("FileAttributes: {0}",f.Attributes.ToString());
//Удаление файла Myprogram.txt.
Console.WriteLine("Press any key to delete the file");
Console.Read();
fstr.Close();
fi.Delete();
Описание метода Open()
В классе FileInfo есть метод под названием Open () с помощью которого можно создавать файлы, подставляя в параметры значения перечислений FileMode и FileAccess. Следующий фрагмент кода показывает, как это делается:
FileInfo f = new FileInfo("c:\myfile.txt");
FileStream s = f.Open(FileMode.OpenorWrite, FileAccess.Read);
После этого, используя объект 's', можно читать и записывать в файл. В перегруженном методе Open() можно только читать из файла. Для записи в файл необходимо в параметрах открытия использовать значение FileAccess.ReadWrite. Таблицы 8.4 и 8.5 содержат возможные значения FileMode и FileAccess.
Табл.8.4
Значение | Применение |
Append | Для открытия файла и добавления данных. Используется совместностно со значением FileAccess.Write. |
Create | Для создания нового файла. Если файл уже существует, то он затирается. |
CreateNew | Для создания нового файла. Если файл существует, то возникает исключение IOException. |
Open | Для открытия существующего файла |
OpenOrCreate | Для открытия существующего или создания нового файла. Если файл не существует, тобудет создан новый. |
Truncate | Для урезания существующего файла |
Табл.8.5
Значения | Применение |
Read | Для чтения (получения) данных из файла |
ReadWrite | Для записи в или чтения из файла |
Write | Для записи данных в файл |
Запись в текстовый файл при помощи класса StreamWriter
Текстовые данные или любую другую информацию можно записать в файл используя метод CreateText() в классе FileInfo. Однако предварительно необходимо получить валидный StreamWriter. Именно StreamWrite обеспечивает необходимую функциональность для записи в файл. Следующий пример иллюстрирует это:
FileInfo f = new FileInfo("Mytext.txt")
StreamWriter w = f.CreateText();
w.WriteLine("This is from");
w.WriteLine("Chapter 6");
w.WriteLine("Of C# Module");
w.Write(w.NewLine);
w.WriteLine("Thanks for your time");
w.Close();
Чтение из текстового файла
Для чтения из текстового файла можно воспользоваться классом StreamReader. Для этого необходимо указать имя файла в статическом методе OpenText() класса File. Следующий пример считывает содержимое файла, которое было записано в предыдущем примере:
Console.WriteLine("Reading the contents from the file");
StreamReader s = File.OpenText("Mytext.txt");
string read = null;
while ((read = s.ReadLine())!= null)
{
Console.WriteLine(read);
}
s.Close();
Работа с разными кодировками.
По умолчанию в.NET все текстовые данные в кодировке UTF8, но часто требуется считать текстовый файл, сохраненный в другой кодировке, допустим в WIN1251. В таком случае если в файле был русский текст в кодировке WIN1251, при считывании его в UTF8 мы получим нечитаемые данные. Для того чтобы переводить строки из одной кодировки в другую существует класс Encoding из пространства имен System.Text, благодаря которому зная исходную кодировку мы можем привести текстовые данные к нужной кодировке. Рассмотрим следующий пример, например, мы хотим конвертировать считанную строку в кодировке WIN1251 в кодировку DOS(866), для этого мы можем использовать следующий код:
class Program
{
private static string in1251;
private static readonly Encoding enc1251 = Encoding.GetEncoding(1251);
private static readonly Encoding enc866 = Encoding.GetEncoding(866);
static void Main(string[] args)
{
//....
//тут каким то образом получаем данные в in1251
byte[] sourceBytes = enc1251.GetBytes(in1251);
string outputString = enc866.GetString(sourceBytes);
//далее делаем то что требуется с полученной строкой
//....
}
}
В sourceBytes мы получили входную строку в виде массива байт, которые далее мы можем так же посредством Encoding сохранить в строку с нужной кодировкой. В случае, когда мы читаем текст уже известной кодировке из файла, дела обстоят еще проще. При создании экземпляра StreamReader мы можем явно указать кодировку источника, код будет выглядеть следующим образом:
using (var sr = new StreamReader("Mytext.txt", Encoding.GetEncoding(1251)))
{
string read = null;
while ((read = sr.ReadLine())!= null)
Console.WriteLine(read);
}
Рассмотрим пример работы с файлами. При записи в файл в нужной кодировке для StreamWriter так же можно указать кодировку, в которой будет текст.
Поместим на форму 4 кнопки и текстовое поле:
button1 свойство Text = Создать файл
button2 свойство Text = Удалить файл
button3 свойство Text = Записать текст в файл
button4 свойство Text = Прочитать файл
и в текстовом поле свойство Multiline = true (включение многострочного режима)
Вот что должно получиться (рис.8.1):
Рис.8.1. Вид окна работы с файлами
Код программы.
Листинг 8.1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO; //Подключаем пространство имен для работы с файлами
namespace Files
{
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
FileInfo file = new FileInfo("vbbook.txt");
}
/**
* Создание файлов
*/
private void button1_Click(object sender, EventArgs e)
{
FileInfo file = new FileInfo("vbbook.txt");
if (file.Exists == false) //Если файл не существует
{
file.Create(); //Создаем
}
else MessageBox.Show("Файл уже создан!");
}
/**
* Удаляем файл
*/
private void button2_Click(object sender, EventArgs e)
{
FileInfo file = new FileInfo("vbbook.txt");
if (file.Exists == true) //Если файл существует
{
file.Delete(); //Удаляем
}
else MessageBox.Show("Файла не существует!!");
}
/**
* Записать текст в файл
*/
private void button3_Click(object sender, EventArgs e)
{
StreamWriter write_text; //Класс для записи в файл
FileInfo file = new FileInfo("vbbook.txt");
write_text = file.AppendText(); //Дописываем инфу в файл, если файла не существует он создастся
write_text.WriteLine(textBox1.Text); //Записываем в файл текст из текстового поля
write_text.Close(); // Закрываем файл
}
private void button4_Click(object sender, EventArgs e)
{
StreamReader streamReader = new StreamReader("vbbook.txt"); //Открываем файл для чтения
string str = ""; //Объявляем переменную, в которую будем записывать текст из файла
while (!streamReader.EndOfStream) //Цикл длиться пока не будет достигнут конец файла
{
str += streamReader.ReadLine(); //В переменную str по строчно записываем содержимое файла
}
textBox1.Text = str;
}
}
}
Задания к лабораторной работе 8:
1. Изучить предлагаемую теорию.
2. Записать и откомпилировать программу листинга 8.1, использующие графический интерфейс.
3. Выполнить домашние задания, согласно номеру варианта.