Лекция № 6

Тема: «Программное управление папками и файлами»

 

План

1. Работа с папками и путями

2. Команды управления файлами

3. Работа с путями к папкам и файлам

4. Использование классов для обработки текстовых файлов

5. Форматированный вывод текста

 

1. Работа с папками

В некоторых программах необходимо выполнять некоторые операции с папками: определение текущей папки, создание, открытие, удаление, переименование папки. Все эти операции можно выполнить с помощью специального класса Directory, для работы с которым нужно подключить пространство имен

 

using System.IO;

 

Правила записи пути в C#

Перед рассмотрением принципов работы в папками необходимо указать на правила записи путей к папкам и файлам в коде C#. Как известно, элементы пути разделяются между собой символом обратного слеша "\", но еще при изучении языка C++ мы знаем, что данный символ служит для задания некоторых управляющих символов (\n, \t и т.п.). Поэтому, чтобы компилятор C# воспринимал обратный слеш именно как символ, его нужно указывать два раза "\\". Например, "c:\\arhiv\\primer\\file.txt".

Вы можете записывать пути и в более привычном виде с одинарным слешем, но в  этом случае перед строкой с путем необходимо указывать символ @, который указывает на то, что все символы, идущие далее, необходимо воспринимать так, как они записаны. Например, @"c:\arhiv\primer\file.txt".

 

Методы класса Directory для работы с папками

Класс Directory имеет встроенные методы для выполнения всех необходимых операций над папками. Приведем основные их них:

- Directory.CreateDirectory("имя_папки"); - создает папку с указанным именем. Если указать цепочку вложенных папок, то вся цепочка будет создана автоматически. Например:

 

Directory.CreateDirectory("c:\\111\\222\\333"); или Directory.CreateDirectory(@"c:\111\222\333");

 

Если не диске C: не окажется ни одной из папок, указанных в цепочке, то все они буду созданы. Если какая-то из папок будет существовать, то подпапки будут созданы в ней.

 

- Directory.Delete("имя_папки"[, true/false]); - удаляет папку со всеми вложенными подкаталогами и файлами (если указан параметр true), или только пустую (если указан параметр false). По умолчанию задан параметр false.

Например:

 

Directory.Delete("C:\\111\\222", false); //выдаст ошибку, так как папка 222 не пустая, в ней находится папка 333.

Параметр false можно не указывать, так как он действует по умолчанию. Предыдущую команду можно записать короче:

Directory.Delete("C:\\111\\222");

 

Directory.Delete("C:\\111\\222", true); //папка 222 будет удалена со всем ее содержимым

 

- Directory.Exists("имя_папки") - проверяет наличие указанной папки на диске. Если папка существует, то метод возвращает значение true, в противном случае - false. Данный метод нужно использовать всякий раз, когда вы планируете выполнить какое-то действие над папкой. Например, код удаления папки может иметь вид:

 

//если папка существует

if (Directory.Exists("C:\\111\\222"))

    //удаляем ее со всем содержимым

    Directory.Delete("C:\\111\\222", true);  

 

- Directory.GetCurrentDirectory() - возвращает имя текущей папки в виде строки. Например:

 

//описываем строковую переменную и записываем в нее имя текущей папки

string DirName = Directory.GetCurrentDirectory();

//выводим в сообщении значение переменной

MessageBox.Show(DirName);

 

- Directory.GetDirectories("имя_папки") - возвращает в виде массива строк полные имена вложенных папок. Например:

 

//если папка c:\111\222 не существует, то код не выполняется

if (!Directory.Exists("c:\\111\\222")) return;

//описываем строковый массив DirArray и записываем в него список вложенных папок

string[] DirArray = Directory.GetDirectories("c:\\111\\222");

//организуем цикл по массиву

//в строковую переменную Dir считываем очередной элемент массива

foreach(string Dir in DirArray)

    //выводм в сообщении значение переменной Dir

    MessageBox.Show(Dir);

 

Иногда нужно определить, есть ли в текущей папке вложенные папки без их имен. Зная, что метод возвращает массив, можно проверить свойство Length (размер) возвращаемого массива.

 

//если размер возвращаемого массива подпапок = 0

if (Directory.GetDirectories("c:\\111\\222").Length==0)
        //значит вложенных папок нет

    . . .

 

- Directory.GetFiles("имя_папки") - возвращает в виде массива строк полные имена вложенных файлов. Например:

 

//если папка c:\111\222 не существует, то код не выполняется

if (!Directory.Exists("c:\\111\\222")) return;

//описываем строковый массив FileArray и записываем в него список вложенных файлов

string[] FileArray = Directory.GetFiles("c:\\111\\222");

//организуем цикл по массиву

//в строковую переменную File считываем очередной элемент массива

foreach (string File in FileArray)

    //выводим в сообщении значение переменной File

    MessageBox.Show(File);

 

Иногда нужно определить, есть ли в текущей папке вложенные файлы без их имен. Зная, что метод возвращает массив, можно проверить свойство Length (размер) возвращаемого массива.

 

//если размер возвращаемого массива файлов = 0

if (Directory.GetFiles("c:\\111\\222").Length==0)
        //значит файлов в папке нет

    . . .

 

- Directory.GetParent("имя_папки") - возвращает имя родительской папки. Результат имеет специальный тип DirectoryInfo, который хранит в себе всю информацию о папке (имя, полное имя, дату и время создания, атрибуты и т.п.). Например:

 

//описываем переменную типа DirectoryInfo и записываем в нее имя родительской папки

DirectoryInfo ParentDir = Directory.GetParent("c:\\111\\222");

//в сообщении выводим полное имя родительской папки

MessageBox.Show(ParentDir.FullName);

//в сообщении выводим дату и время создания родительской папки

MessageBox.Show(ParentDir.CreationTime.ToString());

 

- Directory.Move("папка_источник", "папка_приемник"); - перемещает папку_источник со всем ее содержимым по новому пути. При этом в работе команды есть ограничения:

- перемещение можно выполнять только в предалах одного логического диска. Вы не сможете переместить папку с диска C: на диск D:

- родительские папки в пути папки_приемнике должны существовать на диске.

Например:

 

//папка 222 будет перемещена из папки c:\111 в папку c:\333 и переименована под именем 444

//при этом папка c:\333 должна существовать на диске

Directory.Move("C:\\111\\222", "c:\\333\\444");

 

- Directory.SetCurrentDirectory("имя_папки"); - устанавливает указанную папку в качестве текущей. Например:

 

//устанавливаем в качестве текущей папку c:\111\222

Directory.SetCurrentDirectory("c:\\111\\222");

//получаем массив файлов в текущей папке

string[] FilesArray = Directory.GetFiles(Directory.GetCurrentDirectory());

//выводи в сообщении количество файлов в текущей папке

MessageBox.Show(FilesArray.Length.ToString());

 

2. Команды управления файлами

Для выполнения операций над файлами в C# существует специальный класс File, для работы с которым также нужно подключить пространство имен

 

using System.IO;
 

Класс File имеет встроенные методы для выполнения всех необходимых операций над файлами. Приведем основные их них:

 

 -File.AppendAllLines("имя_файла",массив_строк); - добавляет в указанный файл набор строк. Если файл отсутствует, то он будет создан. В качестве набора строк может выступать содержимое многострочного текстового поля. Например:

 

//добавляем в файл primer.txt содержимое многострочного текстового поля

File.AppendAllLines("primer.txt", textBox1.Lines);

 

-File.AppendAllText("имя_файла", строка); - добавляет в указанный файл указанную строку. Если файл отсутствует, то он будет создан. В качестве строки может выступать содержимое любого строкового свойства, строковая переменная и т.п. Например:

 

//добавляем в файл primer.txt содержимое текстового поля

File.AppendAllText("primer.txt", textBox1.Text);

//добавляем в файл primer.txt значение выбранного элемента в списке listBox1

File.AppendAllText("primer.txt", listBox1.Text);

//добавляем в файл primer.txt значение строковой переменной str

string str = "Текст для добавления";

File.AppendAllText("primer.txt", str);
 

При использовании данной команды перевод курсора на следующую строку не выполняется, т.е. все добавленные значения в файл записываются последовательно, сливаясь друг с другом. Если после добавления текста необходимо перейти на следующую строку в файле, то необходимо в конце добавляемого текста указывать признак перехода на следующую строку (Environment.NewLine). Например:

 

//добавляем в файл primer.txt содержимое текстового поля

File.AppendAllText("primer.txt", textBox1.Text+Environment.NewLine);

//добавляем в файл primer.txt значение выбранного элемента в списке listBox1

File.AppendAllText("primer.txt", listBox1.Text+Environment.NewLine);

//добавляем в файл primer.txt значение строковой переменной str

string str = "Текст для добавления";

File.AppendAllText("primer.txt", str+Environment.NewLine)

 

- File.Copy("файл_источник", "файл_приемник"[, true/false]); - копирует файл источник в файл приемник. Если указан параметр true, то файл-приемник будет перезаписываться, если он существует на диск, если указан параметр false - не будет. Параметр false установлен по умолчанию и его можно не указывать. Например:

 

//копируем файл primer.txt из текущей папки в файл report.txt на диске D:

//если файл report.txt существует, то он будет перезаписан

File.Copy("primer.txt", "d:\\report.txt", true);

 

//копируем файл primer.txt из текущей папки в файл result.txt на диске D:

//если файл result.txt существует, то он не будет перезаписан (параметр false можно не указывать)

File.Copy("primer.txt", "d:\\result.txt");

 

- File.Delete("имя_файла"); - удаляет указанный файл с диска. Например:

 

//удаляем созданные копии файла

File.Delete("d:\\report.txt");

File.Delete("d:\\result.txt");

 

- File.Exists("имя_файла") - проверяет наличие указанного файла на диске. Если файл существует, то возвращает значение true, в противном случае - false. Например:

 

//если на диске D: существует файл primer.txt

 if (File.Exists("d:\\primer.txt"))

    //удаляем этот файл

    File.Delete("d:\\primer.txt");

 

- File.Move("файл_источник", "файл_приемник"); - перемещает файл_источник в файл_приемник. Допускается перемещение на другие логические диски и переименование файла. Например:

 

//перемещает файл primer.txt на диск D: под тем же именем

File.Move("primer.txt", "d:\\primer.txt");

//перемещает файл primer.txt с диска D: на диск C: под именем result.txt

File.Move("d:\\primer.txt", "c:\\result.txt");

 

- File.ReadAllLines("имя_файла"); - открывает файл, построчно считывает содержимое файла в строковый массив и закрывает файл. Результат считывания может быть записан в многострочное текстовое поле или в массив строк для последующей обработки. Например:

 

//считываем содержимое файла primer.txt и помещаем в многострочное текстовое поле

textBox1.Lines=File.ReadAllLines("primer.txt");

//описываем массив строк StrRez и помещаем в него содержимое файла primer.txt

string[] StrRez = File.ReadAllLines("primer.txt");

//в цикле считываем порследовательно элементы массива в переменную Str

foreach (string Str in StrRez)

    //выводим переменную Str в сообщении

    MessageBox.Show(Str);

 

- File.ReadAllText("имя_файла"); - открывает файл, считывает содержимое файла в виде одного строкового значения и закрывает файл. Результат считывания можно присвоить любому строковому свойству или строковой переменной. Например:

 

//считываем в текстовое поле содержимое файла primer.txt

textBox1.Text=File.ReadAllText("primer.txt");

//описываем строковую переменную Str и считываем в нее содержимое файла primer.txt

string Str = File.ReadAllText("primer.txt");

//выводим значение переменной Str в сообщении

MessageBox.Show(Str);

 

 -File.WriteAllLines("имя_файла",массив_строк); - записывает в указанный файл набор строк. Если файл отсутствует, то он будет создан. Если файл существует, то он будет перезаписан заново. В качестве набора строк может выступать содержимое многострочного текстового поля. Например:

 

//записываем в файл primer.txt содержимое многострочного текстового поля

File.WriteAllLines("primer.txt", textBox1.Lines);

 

-File.WriteAllText("имя_файла", строка); - записывает в указанный файл указанную строку. Если файл отсутствует, то он будет создан. Если файл существует, то он будет перезаписан заново. В качестве строки может выступать содержимое любого строкового свойства, строковая переменная и т.п. Например:

 

//записываем в файл primer.txt содержимое текстового поля

File.WriteAllText("primer.txt", textBox1.Text);

//записываем в файл primer.txt значение выбранного элемента в списке listBox1

File.WriteAllText("primer.txt", listBox1.Text);

//записываем в файл primer.txt значение строковой переменной str

string str = "Текст для добавления";

File.WriteAllText("primer.txt", str);
 

При использовании данной команды перевод курсора на следующую строку не выполняется, т.е. все добавленные значения в файл записываются последовательно, сливаясь друг с другом. Если после добавления текста необходимо перейти на следующую строку в файле, то необходимо в конце добавляемого текста указывать признак перехода на следующую строку (Environment.NewLine). Например:

 

//записываем в файл primer.txt содержимое текстового поля

File.WriteAllText("primer.txt", textBox1.Text+Environment.NewLine);

//записываем в файл primer.txt значение выбранного элемента в списке listBox1

File.WriteAllText("primer.txt", listBox1.Text+Environment.NewLine);

//записываем в файл primer.txt значение строковой переменной str

string str = "Текст для добавления";

File.WriteAllText("primer.txt", str+Environment.NewLine);

 

3. Работа с путями к папкам и файлам

Умение работать с путями к папкам или файлам - это один из важных навыков в программировании. Как известно, полный путь к файлу состоит из имени логического диска, имени папки, имени файла и расширения. При создании программ разработчику иногда приходиться работать как с полным путем, так и с его частями, предварительно извлекая их из полного пути. Для облегчения этой работы в языке C# иеется специальный класс Path, для работы с которым также нужно подключить пространство имен

 

using System.IO;
 

Класс Path имеет встроенные методы для выполнения всех необходимых операций над путями. Приведем основные их них:

 

- Path.GetDirectoryName("имя_файла") - возвращает из полного пути к файлу имя папки в виде строки. Например:

 

//описываем строковую переменную FolderName

//и записываем в нее имя папки из полного пути

string FolderName = Path.GetDirectoryName("c:\\111\\222\\primer.txt");

//вернет значение "c:\111\222"

 

-Path.GetExtension("имя_файла") - возвращает из полного пути к файлу расширение в виде строки. Например:

 

//описываем строковую переменную ExtName

//и записываем в нее расширение из полного пути

string ExtName = Path.GetExtension("c:\\111\\222\\primer.txt");

//вернет значение ".txt"

 

- Path.GetFileName("имя_файла") - возвращает из полного пути к файлу имя файла в виде строки. Например:

 

//описываем строковую переменную FileName

//и записываем в нее имя файла из полного пути

string FileName = Path.GetFileName("c:\\111\\222\\primer.txt");

//вернет значение "primer.txt"

 

- Path.GetFileNameWithoutExtension("имя_файла") - возвращает из полного пути к файлу имя файла без расширения в виде строки. Например:

 

//описываем строковую переменную FileNameNoExt

//и записываем в нее имя файла без расширения из полного пути

string FileNameNoExt = Path.GetFileNameWithoutExtension("c:\\111\\222\\primer.txt");

//вернет значение "primer"

 

- Path.GetPathRoot("имя_файла")- возвращает из полного пути к файлу имя корневого каталога (логического диска) в виде строки. Например:

 

//описываем строковую переменную RootName

//и записываем в нее имя файла без расширения из полного пути

string RootName = Path.GetPathRoot("c:\\111\\222\\primer.txt");

//вернет значение "c:\"

 

- Path.GetRandomFileName() - возвращает в виде строки случайное имя файла и случайное расширение как набор произвольных символов. Используется, если нужно при работе программы создать некоторый файл, а после обработки удалить его с диска. Данный метод будет гарантировать, что такой файл будет всегда иметь уникальное имя и никаких сбоев в программе, связанных с попыткой пересоздания файла с существующим именем не будет. Например:

 

//описываем строковую переменную FileName

//и записываем в нее случайное имя файла и случайное расширение

string FileName = Path.GetRandomFileName();

//далее с помощью переменной FileName вы можете создать файл и работать с ним

 

- Path.GetTempFileName() - возвращает в виде строки случайное имя для временного файла с расширением .tmp. При этом, в отличии от предыдущего метода, возвращается полное имя файла с расположением во временной папке Temp. То есть метод определяет путь к папке Temp на машине пользователя и создает случайное имя временного файла с указанием полного пути к этой временной папке. Например:

 

//описываем строковую переменную TempFileName

//и записываем в нее случайное имя временного файла

string TempFileName = Path.GetTempFileName();

//вернет значение C:\Users\имя_пользователя\AppData\Local\Temp\случайное_имя.tmp

//далее с помощью переменной TempFileName вы можете создать файл и работать с ним

 

Часто при написании кода необходимо обратиться к папке, в которой находится исходный файл программы. Полный путь к исполняемому файлу можно определить с помощью свойства:

 

Application.StartupPath

 

Данное свойство рекомендуется использовать постоянно при указании имен файлов, расположенных в папке с программой. Если в процессе работы программы пользователь вызовет диалог открытия или сохранения файла, то текущая папка в вашем проекте измениться на ту, которую укажет пользователь в диалоге. Следовательно, если в коде вы указываете только имя файла, то такой файл уже будет искаться операционной системой не в папке с программой, а в новой текущей папке, что приведет к сбою приложения. Для решения этой проблемы всегда к имени файла добавляйте путь к папке с программой. Например:

 

//метод копирования файла выше был записан так

//копируем файл primer.txt из текущей папки в файл report.txt на диске D:

//если файл report.txt существует, то он будет перезаписан

File.Copy("primer.txt", "d:\\report.txt", true);

 

Если пользователь в диалоге сменит текущую папку, то файл primer.txt уже не будет найден в новой папке и программа выдаст ошибку. Необходимо сделать так, чтобы файл primer.txt всегда искался ОС именно в папке с программой. Для этого перепишем пример по-другому:

 

//копируем файл primer.txt из текущей папки в файл report.txt на диске D:

//если файл report.txt существует, то он будет перезаписан

File.Copy(Application.StartupPath+"\\primer.txt", "d:\\report.txt", true);

 

Подобным образом нужно записывать пути ко всем файлам, находящимся в папке с программой. Допускается использование имен вложенных папок. Например, пусть в папке с программой имеется вложенная папка DBase, в которой находится файл базы данных dekanat.mdb. В этом случае путь к файлу правильно записать так:

 

Application.StartupPath+"\\DBase\\dekanat.mdb"

 

4. Использование классов для обработки текстовых файлов

Для обработки текстовых файлов в языке C# имеются специальные классы, предназначенные для чтения данных из текстовых файлов и записи данных в текстовый файл:

 

StreamReader - класс для чтения из текстового файла;

StreamWriter - класс для записи в текстовый файл.

 

Для работы с данными классами необходимо подключить пространство имен

 

using System.IO;

 

Класс StreamReader

Для работы с данным классом необходимо выполнить ряд действий:

- создать переменную-экземпляр класса с помощью описания:

 

//создаем экземпляр класса и связываем его с файлом на диске

StreamReader имя_переменной = new StreamReader(имя_файла);

 

//для примера опишем переменную sr и свяжем ее с файлом primer.txt,

//находящимся в папке с программой

StreamReader sr = new StreamReader(Application.StartupPath + "\\primer.txt");

 

- для чтения строки из файла данный класс имеет специальный метод

 

имя_переменной.ReadLine() - возвращает в виде строки текущую строку файла и переводит указатель на следующую строку. Например:

 

string s = sr.ReadLine();

 

Если нужно прочитать содержимое всего файла, то чтение организуют в цикле. При этом признаком окончания чтения выступает свойство EndOfStream, которое возвращает true, если достигнут конец файла. Например:

 

string s;

//запускаем цикл пока не достигнут конец файла

while (!sr.EndOfStream)

{

    //в переменную считываем очередную строку файла  

    s=sr.ReadLine();

    //выводим в сообщении считанную строку

    MessageBox.Show(s);

}

 

Обратите внимание, что информация из файла всегда считывается в строковом формате. Поэтому, если считываются числовые значения, то для их обработки требуется выполнять операцию конвертации текста в число.

 

- после окончания чтения файл нужно закрыть. В противном случае файл остается недоступен для любых операций с ним, в том числе и средствами операционной системы. Для закрытия файла используют метод:

 

имя_переменной.Close();

 

//в нашем случае

sr.Close();

 

- если работа с файлом завершена, то можно удалить из памяти переменную-экземпляр класса с помощью метода:

 

имя_переменной.Dispose();

 

//в нашем случае

sr.Dispose();

 

Класс StreamWriter

Для работы с данным классом необходимо выполнить ряд действий:

- создать переменную-экземпляр класса с помощью описания:

 

//создаем экземпляр класса и связываем его с файлом на диске

StreamWriter имя_переменной = new StreamWriter(имя_файла[, true/false]);

 

Параметр true указывает на то, что если файл существует, то его нужно дописывать. Параметр false указывает на то, что если файл существует, его нужно создать заново. Значение false действует по умолчанию и его можно не указывать.

 

//для примера опишем переменную sw и свяжем ее с файлом result.txt,

//находящимся в папке с программой

StreamWriter sw = new StreamWriter(Application.StartupPath + "\\result.txt");

 

- для записи строки в файла данный класс имеет специальный метод

 

имя_переменной.WriteLine("текст") - записывает указанный текст в файл и переводит указатель на следующую строку. Например:

 

sr.WriteLine("Пример текста");

 

- после окончания записи файл нужно закрыть. В противном случае файл остается недоступен для любых операций с ним, в том числе и средствами операционной системы. Для закрытия файла используют метод:

 

имя_переменной.Close();

 

//в нашем случае

sw.Close();

 

- если работа с файлом завершена, то можно удалить из памяти переменную-экземпляр класса с помощью метода:

 

имя_переменной.Dispose();

 

//в нашем случае

sw.Dispose();

 

Пример. Пусть имеется два текстовых поля textBox1 и textBox2. Необходимо посчитать сумму этих полей и записать результат в файл result.txt с поясняющим текстом.

 

//создаем экземпляр класса и пересоздаем связанный файл

StreamWriter sw = new StreamWriter(Application.StartupPath + "\\result.txt");

//записываем с новой строки данные в файл

sw.WriteLine("Исходные данные:");

sw.WriteLine("Первое число: "+textBox1.Text);

sw.WriteLine("Второе число: "+textBox2.Text);

sw.WriteLine("Сумма: "+(Convert.ToInt32(textBox1.Text)+Convert.ToInt32(textBox2.Text)).ToString());

//закрываем файл

sw.Close();

//удаляем из памяти экземпляр класса

sw.Dispose();

 

Пример. В текстовый файл primer.txt дописать еще два числа на разных строках.

 

//создаем экземпляр класса и уазываем признак дописывания

StreamWriter sw = new StreamWriter(Application.StartupPath + "\\primer.txt",true);

//дописываем с новой строки данные в файл

sw.WriteLine("10");

sw.WriteLine("20");

//закрываем файл

sw.Close();

//удаляем из памяти экземпляр класса

sw.Dispose();

 

Пример. В текстовом файле primer.txt все значения меньше 10, увеличить в два раза.

 

//если файл primer.txt не существует, код не выполняется 

if (!File.Exists(Application.StartupPath + "\\primer.txt")) return;

 

//создаем экземпляр класса для чтения из файла primer.txt

StreamReader sr = new StreamReader(Application.StartupPath + "\\primer.txt");

 

//в строковую переменную записываем случайное имя временного файла

string TempFileName = Path.GetTempFileName();

//создаем экземпляр класса для записи во временный файл

StreamWriter sw = new StreamWriter(TempFileName);

 

//описываем переменную для чтения из файла

string s="";

//цикл до конца файла

while (!sr.EndOfStream)

{

    //считываем строку из файле в переменную и переходим на новую строку

    s = sr.ReadLine();

    //если считанное значение < 10

    if (Convert.ToInt32(s)<10)

        //увеличиваем его в 2 раза и записываем его во временный файл

        sw.WriteLine((Convert.ToInt32(s)*2).ToString());

    //если считанной значение не < 10

    else

        //записываем его во временный файл без изменений

        sw.WriteLine(s);

}

//закрываем файлы

sr.Close();

sw.Close();

//удаляем из памяти экземпляры классов

sr.Dispose();

sw.Dispose();
 

//удаляем старую версию исходного файла

File.Delete(Application.StartupPath + "\\primer.txt");

//временный файл с результатом переименовываем под именем исходного файла

File.Move(TempFileName, Application.StartupPath + "\\primer.txt");

 

Пример. В текстовом файле удалить строки, содержащие значение меньше 10.

 

//если файл primer.txt не существует, код не выполняется 

if (!File.Exists(Application.StartupPath + "\\primer.txt")) return;

 

//создаем экземпляр класса для чтения из файла primer.txt

StreamReader sr = new StreamReader(Application.StartupPath + "\\primer.txt");

 

//в строковую переменную записываем случайное имя временного файла

string TempFileName = Path.GetTempFileName();

//создаем экземпляр класса для записи во временный файл

StreamWriter sw = new StreamWriter(TempFileName);

 

//описываем переменную для чтения из файла

string s="";

//цикл до конца файла

while (!sr.EndOfStream)

{

    //считываем строку из файле в переменную и переходим на новую строку

    s = sr.ReadLine();

    //если считанное значение >= 10

    if (Convert.ToInt32(s)>=10)

        //записываем его во временный файл

        sw.WriteLine(s);

}

//закрываем файлы

sr.Close();

sw.Close();

//удаляем из памяти экземпляры классов

sr.Dispose();

sw.Dispose();
 

//удаляем старую версию исходного файла

File.Delete(Application.StartupPath + "\\primer.txt");

//временный файл с результатом переименовываем под именем исходного файла

File.Move(TempFileName, Application.StartupPath + "\\primer.txt");

 

Используя класс TStringList и знания языка разметки HTML можно проводит экспорт данных в формат WEB.

Пример. Необходимо экспортировать в файл HTML в виде таблицы значение функции sin(x) на отрезке 1..10.

 

 //создаем экземпляр класса с созданием файла result.htm

StreamWriter sw = new StreamWriter(Application.StartupPath + "\\result.htm");

//записываем тег начала таблицы

sw.WriteLine("<table width = 60% border = 1px>");

//создаем первую строку (шапку таблицы)

//записываем тег начала строки

sw.WriteLine("<tr>");

//в ячейках выводим заголовки колонок таблицы

sw.WriteLine("<td> x </td>");

sw.WriteLine("<td> sin(x) </td>");

//записываем тег конца строки

sw.WriteLine("</tr>");

 

//запускаем цикл от 1 до 10

for (int i = 1; i <= 10; i++)

{

    //записываем тег начала строки

    sw.WriteLine("<tr>");

    //добавляем в ячейку первой колонки значение аргумента

    sw.WriteLine("<td>" + i.ToString() + "</td>");

    //добавляем в ячейку второй колонки значение функции

    sw.WriteLine("<td>" + Math.Sin(i).ToString() + "</td>");

    // закрывает тег строки

    sw.WriteLine("</tr>");

}

 

// закрываем тег таблицы

sw.WriteLine("</table>");

 

//закрываем файл

sw.Close();

//удаляем из памяти экземпляр класса

sw.Dispose();

 

5. Форматированный вывод текста

При выводе текстовой информации как на форму так и в файлы часто возникает необходимость форматирования текста: вывести в колонки, с заданной шириной и т.п. Для решения данной задачи используют специальный класс String, а именно один из его методов:

 

String.Format("формат вывода", пер1, пер2,..., перN)

 

Данный метод выводит значения указанных переменных в формате, заданном внутри метода в двойных кавычках. При этом для задания формата использую запись вида:

 

{номер переменной, ширина в символах:формат} - нумерация переменных с 0

 

"Ширина в символах" может задаваться отрицательным (выравнивание по левому краю) или положительным (выравнивание по правому краю).

"Формат" может состоять из следующих обозначений:

d - целое число

s - строка

fчисло - вещественное с указанием числа знаков после запятой.

 

Пример.

//пусть даны переменные разных типов

int a=34567;

string s = "Пример текста";

double d = 125.524789556;

 

//выведем в сообщении первое целое число шириной в 10 символов

//второе строковое значение шириной в 25 символов

//третье вещественное значение шириной в 10 символов и 3 знака после запятой

 

//нулевая переменная (a) - целая, шириной 10

//первая переменная (s) - строковая, шириной 25

//вторая переменная (d) - вещественная, шириной 10 и 3 знака после запятой

MessageBox.Show(String.Format("{0,10:d} {1,25:s} {2,10:f3}", a,s,d));

 

 

Если ширина вывода превышает реальное значение переменной, то значение по умолчанию выравнивается по правому краю. Если нужно выровнять значение по левому краю, то ширину указывают со знаком "-". Например, перепишем предыдущий пример, но строковую переменную выровняем по левому краю.

 

//пусть даны переменные разных типов

int a=34567;

string s = "Пример текста";

double d = 125.524789556;

 

//выведем в сообщении первое целое число шириной в 10 символов

//второе строковое значение шириной в 25 символов с выравниванием по левому краю

//третье вещественное значение шириной в 10 символов и 3 знака после запятой

 

//нулевая переменная (a) - целая, шириной 10

//первая переменная (s) - строковая, шириной 25 с выравнивание по левому краю (добавляем знак "-")

//вторая переменная (d) - вещественная, шириной 10 и 3 знака после запятой

MessageBox.Show(String.Format("{0,10:d} {1,-25:s} {2,10:f3}", a,s,d));

 

Вопросы для самоконтроля

1. Какие методы для работы с папками Вы знаете?

2. Какие методы для работы с файлами Вы знаете?

3. Какие методы для работы с полными путями к папкам и файлам Вы знаете?

4. Какие классы используются для управления текстовыми файлами? Как описать переменные-экземпляры этих классов?

5. Какие методы классов чтения и записи текстовых файлов вы знаете?

6. Какой метод позволяет выполнить форматирование вывода: