Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа с файлами.pdf
Скачиваний:
21
Добавлен:
15.04.2015
Размер:
350.23 Кб
Скачать

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

Работа с файлами в C#

1

Оглавление

 

1.Общие сведения о файловой системе ОС Windows.....................................................................

3

Текстовые и двоичные файлы. .....................................................................................................

3

Исполнимые файлы. .....................................................................................................................

3

Файлы документов. .......................................................................................................................

3

Имена файлов ................................................................................................................................

3

Каталоги. ........................................................................................................................................

4

Корневой каталог ..........................................................................................................................

5

Имена дисков. ................................................................................................................................

5

Полное имя файла. ........................................................................................................................

6

Размещение файлов на жёстком диске. .......................................................................................

6

Атрибуты файлов. .........................................................................................................................

7

2.Работа с файлами в C#....................................................................................................................

7

Пространство имен........................................................................................................................

7

Работа с классами DirectoryInfo и FileInfo..................................................................................

7

Работа с файлами в директории...................................................................................................

8

Создание подкаталогов..................................................................................................................

9

Создание файлов при помощи класса FileInfo............................................................................

9

Описание метода Open()...........................................................................................................

9

Запись в текстовый файл при помощи класса StreamWriter....................................................

10

Чтение из текстового файла........................................................................................................

10

Работа с разными кодировками..................................................................................................

10

3.Чтение и запись двоичных (бинарных) файлов..........................................................................

11

Общие сведения ..........................................................................................................................

11

Установочные и завершающие операции .................................................................................

12

Создание нового файла или перезапись существующего ..................................................

12

Сткрытие существующего файла на чтение ........................................................................

13

Завершение работы с файлом................................................................................................

13

Операции ввода-вывода ..............................................................................................................

13

Запись в открытый файл.........................................................................................................

13

Чтение данных из двоичного файла......................................................................................

13

Специальные операции ..............................................................................................................

13

4.Примеры ........................................................................................................................................

14

5.Контрольные задания....................................................................................................................

19

6.Контрольные вопросы...................................................................................................................

21

2

1.ИнформацияОбщие сведенияна дискахо (жесткихфайловойдисках,системедискетах,ОСмагнитооптическихWindows дисках, компьютерных компакт-дисках и т.д.) хранится в файлах. . В Ффайлах— этомогутпоимехранитьсяованнаятекстыобластьпрограмм,на дискедокументы,или другомготовыеносителекинформацвыполнению программы и любые другие данные.

Часто файлы разделяютТекстовыена две категориидвоичные— текстовыефайлыи. двоичные. Текстовые файлы предназначены для чтения человеком. Они состоят из строк символов, причем каждая строка оканчивается двумя специальными символами «возврат каретки» (СR) и «новая строка» (LF). При редактировании и просмотре текстовых файлов эти специальные символы, как правило, не видны, в текстовых файлах хранятся тексты программ, командных файлов и т.д. Файлы, не являющиеся текстовыми, по традиции называются двоичными.

Каждая программа (кроме операционнойИсполнимыесистемы,файлы. которая запускается при включении компьютера) содержит в своем составе файл, который запускает эту программу. Такой файл называется исполнимым файлом. Иначе говоря, исполнимый файл —это головной файл программы, запускающий ее на выполнение. Если программа состоит из одного файла, то этот файл и является исполнимым файлом. По традиции исполнимые файлы обычно имеют расширение имени .СОМ или .ЕХЕ.

Кроме файлов программ, на ВашихФайлыдискахдокументоввсегда будут файлы,. содержащие данные, с которыми Вы работаете. Чаще всего данные, соответствующие одному документу, с которым Вы работаете, содержатся в одном файле. Такие файлы обычно называют файлами документов. Например, большинство редакторов текстов, электронных таблиц, сохраняют любой обрабатываемый документ (таблиц; рисунок и т.д.) в одном файле. Для работы с такими документами надо запустить соответствующую программу и считать (часто говорят — открыть) документа в этой программе.

Чтобы операционная система и другиеИменапрограммыфайлов могли обращаться к файлам, файлы должны иметь обозначения. Это обозначения обычно называют именем файла.

В операционной системе Windows, обозначения файлов состоят из двух частей: имени и расширения. Часто имя и расширение вместе также {они}называются именем{файлов}, как правило, это не приводит к путанице. Расширение начинается с точки, за которой следуют от 1 до 3 символов. Например,

Command.com имя .расширение

Допустимые символы. Имя и расширение могут состоять из прописных и строчных

3

латинских букв, цифр и символов В имени и расширении имени файла прописные и строчные латинские буквы

Прописные строчлентными,буквы.

являются эквива так как Windows переводит все строчные буквы в соответствующие прописные буквы. На диске имя файла хранится в версии, записанной прописными (то есть большими) буквами.

Расширениеименифайла. является необязательным. Оно, как правило, описывает содержание файла, поэтому использование расширения весьма удобно. Многие программы устанавливают расширение имени файла, и по нему Вы можете узнать, какая программа создала файл. Кроме того, многие программы (Norton commander, Диспетчер Файлов Windows и т.д.) позволяют по расширению имени файла вызвать соответствующую программу и сразу загрузить в нее данный файл — это весьма полезно, так как экономит время.

Примеры:

-исполнимые файлы (готовые к выполнению программы);

.com,-командные.exe файлы;

bat -программы на Паскале;

.pas - копия файла, создаваемая перед его изменением.

.bak-системный или драйверный файл;

.sys–текстовый файл;

.txt -рабочий временный файл;

.tmp-файл изображения в формате Paintbrash;

.pcx -архивные;

.dbf

.rar,-.файлыarj, .zipбаз данных foxpro

Многие программы используют расширение .ВАК для копий файла, создаваемыхЗамечание.перед его изменением. Наличие такой копии позволяет восстановить содержимое файла в случае его ошибочного изменения или удаления. После окончания работы с файлом, когда пользователь убедился в том, что правильно внес все изменения в файлы, он может уничтожить созданные файлы с расширением .ВАК.

Имена файлов регистрируются на дискахКаталогив каталогах(или. директориях).

-это специальное место на диске, в котором хранятся имена файлов, сведенияКаталого размере файлов, времени их последнего обновления, атрибуты (свойства) файлов и т.д. Если в каталоге хранится имя файла, то говорят, что этот файл находится в данном каталоге. На каждом диске может быть несколько каталогов. В каждом каталоге может быть много файлов, но каждый файл всегда регистрируется только в одном каталоге.

Все каталоги на самом деле являются файлами специального вида. Каждый каталог имеет имя, и он может быть зарегистрирован в другом каталоге. Требования к именам каталогов те же, что к именам файлов. Как правило расширение имени для каталогов не используются.

На каждом диске имеется один главный или корневой каталог. В нем регистрируются файлы и подкаталоги (каталоги 1го уровня). В каталогах 1го уровня регистрируются файлы и каталоги 2-го уровня и т.д. Получается иерархическая древообразная структура каталогов на диске.

4

Каталог, с которым в настоящий момент работает пользователь называется текущим. Если в команде DOS указать имя файла, то этот файл будет создаваться или отыскиваться в текущем каталоге. - это область памяти на диске, выделяемая в процессеДиректорияего форматирования(синон каталога). Диpектоpий представляет собой таблицу, куда заносятся данные о хpанящихся на диске файлах. Каждому файлу в диpектоpии соответствует одна запись.Запись директория включает следующую инфоpмацию: полное имя файла (имя и pасшиpение), дату и время его создания или последней коppектиpовки, объем занимаемой памяти в байтах, а также некотоpую дополнительную информацию, используемую пpи обслуживании файла операционной системой.

Когда вы используете файл не из текущего каталога, необходимо указать, в каком каталоге этот файл находится т.е. указать путь к файлу. Путьэто последовательность из имен каталогов или символов «..», разделенных символом «/». Этот путь задает маршрут от текущего каталога или от корневого каталога диска к тому каталогу, в котором находится нужный файл.

Если путь начинается с символа «/», то маршрут вычисляется от корневого каталога диска, иначе –от текущего каталога. Каждое имя каталога в пути соответствует входу в подкаталог с таким именем, «..» соответствует входу в надкаталог.

Пусть текущий каталог — DOC , тогда:Корневой каталог

..\CHI - путь к каталогу 1-го уровня

LETTERS – путь к подкаталогу LETTERS каталога dos

..\exe\CHI –путь к подкаталогу CHI каталога EXE .

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

По традиции дисководы именуются А:, В:, С: и т .д. Например, в компьютере могут быть два накопителя на гибком магнитном диске А: и В: и один накопитель на жестком магнитном диске С:.

Текущий дисковод-это тот дисковод, с которым вы работаете в настоящее время. Говоря, что обозначения А:, В:, С: и т.д. соответствуют дисководам, мы были не совсем

точны. На самом деле эти обозначения соответствуют не дисководам, а логическим дискам. Дело в том, что любой жёсткий диск можно разделить на несколько частей и работать с ними как с отдельными дисками. Эти части называются логическими дисками, или разделами диска. Каждый логический диск имеет имя, по которому к нему можно обращаться.

Полное имя файла имеет следующийПолноевид (имя[]-необязательныефайла. элементы).

[дисковод:][путь\]имя-файла

5

т.е состоит из пути к каталогу, в котором находится файл и имени файла, разделенных символом «\», перед которым может стоять имя дисковода. Если дисковод не указан, то подразумевается текущий дисковод. Если путь не указан, то подразумевается текущий каталог.

A:mouse.com –в текущем каталоге

A:\mouse.com –в корневом каталоге

ST\mouse.com-в подкаталоге ST текущего каталога

. Во многих командах и именах файлов можно употреблять символы * и ? для указания группы файлов из одного каталога.

Симвоимволы * ?

л *- обозначает любое число любых символов в имени файла или в расширении имени файла.

Символ ?- обозначает один произвольный символ или отсутствие символа в имени файла или в расширении имени файла.

В имени файлов, содержащих указание на каталог или дисковод, символы * и ? обычно употреблять нельзя в той части имени, которая содержит указания на каталог или дисковод.

C:\dos\*.doc-допустимо C:\*\f.docнедопустимо *:\dos\f.doc- -“-

*.bak -все файлы с расширением bak из текущего дисковода.

C*.d* -все файлы начинающиеся с С, и расширением, начинающимся с D из текущего каталога.

В:\doc\as???.* -все файлы из каталога В:\doc с именем, начинающимся AS и состоящим не более чем из 5 символов.

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

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

В корневом каталоге, при работе с жёстким диском, не должно быть большого количества файлов и подкаталогов, поскольку поиск программ и файлов начинается часто с корневого каталога, это ускорит работу и облегчит ориентировку в файловой системе.

Рекомендации размещения:

1)Все файлы, относящиеся к одному комплексу, размещают в одном каталоге и его подкаталогах;

2)Все исполнимые и командные файлы общего назначения желательно размещать в одном каталоге и нескольких его подкаталогах (их описывают в Path);

3)Не следует помещать в одном каталоге файлы, которые не изменяете и файлы, которые можете изменить. Для текстов создают отдельный каталог.

6

Для каждого файла соответствующая ему запись в каталоге содержит следующие

атрибуты:

Атрибуты файлов.

“только для чтения”-предохраняет файл от изменений;(для изменения и

удаления необходимо снять данный атрибут)

“скрытый”-или “системный”

 

 

 

“архивный”-устанавливается при создании файла.

2.Работа с файлами в C#

System.IO содержит все необходимыеПространствоклассы, методыимени свойства для манипуляций с каталогами и файлами (В Таблице 1 приведены основные классы).

Таблица 1: Основные методы класса System.IO

Класс

Применение

Binary Reader и Writer

Чтение и запись простых типов данных

 

 

Directory, File,

Создание, удаление и перемещение файлов и директорий.

Получение подробной информации о файлах, при помощи свойств,

DirectoryInfo и FileInfo

определенных в этих классах.

 

 

FileStream

Доступ к файлам потоковым способом

 

 

MemoryStream

Доступ к данным храняшимся в памяти

 

 

StreamWriter и

Чтение и запись текстовой информации

StreamReader

 

StringReader и

Чтение и запись текстовой информации из строкового буфера

StringWriter

 

Классы DirectoryInfoРаботаи FileInfoс классамиунаследованыDirectoryInfoот FileSystemInfo,и FileInfoкоторый является абстрактным. Это значит, что Вы не можете унаследовать от него свой класс, но можете использовать свойства, определённые в нём. Таблица 2 перечисляет его свойства и методы.

Таблица 2: Основные методы класса FileSystemInfo

Свойства

Назначение

Attributes

Возвращает атрибуты файла в виде значений перечисления FileAttributes

CreationTime

Возвращает время создания файла

Exists

Проверяет является ли файл директорией или нет

Extension

Возвращает расширение файла

LastAccessTime

Возвращает время последнего доступа к файлу

FullName

Возвращает полный путь к файлу

LastWriteTime

Возвращает время последнего изменения файла

Name

Возвращает имя данного файла

7

Delete()

Удаляет файл. Будьте осторожны при использовании этого метода.

 

Класс DirectoryInfo содержит методы для создания, перемещение и удаление

 

каталогов. Чтобы использовать вышеприведённые свойства, необходимо создать

объект класса DirectoryInfo как показано в примере:

DirectoryInfo dir1 = new DirectoryInfo(@"F:\WINNT");

После этого уже можно просмотреть свойства директории при помощи объекта dir1, как показано на фрагмент кода:

Console.WriteLine("Full Name is : {0}", dir1.FullName);

Console.WriteLine("Attributes are : {0}", dir1.Attributes.ToString());

Можно также использовать значения перечисления FileAttributes. Они приведены в таблице 3.

Таблица 3: Значения перечисления FileAttributes

Свойства

Назначение

Archive

Возвращает Архивный статус файла

Compressed

Позволяет узнать сжат файл или нет

Directory

Показывает является ли файл директорией или нет

Encrypted

Показывает закодирован файл или нет

Hidden

Показывает скрыт файл или нет

Offline

Показывает, что данные отсутствуют

ReadOnly

Показывает является ли файл только для чтения

System

Показывает, является ли файл системным (возможно файл в директории

Windows)

 

Предположим, вы хотитеРаботаполучитьс файламисписок всехвфайловдиректориис расширением BMP в папке F:\Pictures. Для этого можно использовать следующий код:

DirectoryInfo dir = new DirectoryInfo(@"F:\WINNT"); FileInfo[] bmpfiles = dir.GetFiles("*.bmp);

Console.WriteLine("Общее количество bmp файлов", bmpfiles.Length);

Foreach( FileInfo f in bmpfiles)

{

Console.WriteLine("Имя : {0}", f.Name); Console.WriteLine("Размер файла : {0}", f.Length); Console.WriteLine("Время создания : {0}", f.CreationTime);

Console.WriteLine("Атрибуты файла : {0}", f.Attributes.ToString());

}

Следующий фрагмент кода описываетСозданиекакподкаталоговможно создать поддиректорию MySub в директории Sub:

8

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("Время создания: {0}",f.CreationTime); Console.WriteLine("Полное имя: {0}",f.FullName); Console.WriteLine("Атрибуты файла: {0}",f.Attributes.ToString()); //Удаление файла Myprogram.txt.

Console.WriteLine("Нажмите любую клавишу для удаления файла"); Console.Read();

fstr.Close(); fi.Delete();

ОписаниеВ классе методаFileInfo естьOpen()метод под названием Open () с помощью которого можно создавать файлы, подставляя в параметры значения перечислений FileMode и FileAccess. Следующий фрагмент кода показывает, как это делается:

FileInfo f = new FileInfo("c:\myfile.txt");

FileStream s = f.Open(FileMode.OpenOrWrite, FileAccess.Read);

После этого, используя объект 's', можно читать и записывать в файл. В перегруженном методе Open() можно только читать из файла. Для записи в файл необходимо в параметрах открытия использовать значение FileAccess.ReadWrite.

Таблицы 4 и 5 содержат возможные значения FileMode и FileAccess.

 

Таблица 4: Возможные значения FileMode

Значение

Применение

Append

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

 

значением FileAccess.Write.

Create

Для создания нового файла. Если файл уже существует, то он затирается.

CreateNew

Для создания нового файла. Если файл существует, то возникает

 

исключение IOException.

Open

Для открытия существующего файла

OpenOrCreate Для открытия существующего или создания нового файла. Если файл не существует, то будет создан новый.

9

Truncate Для урезания существующего файла

 

Таблица 5: Значения FileAccess

Значения

Применение

Read

Для чтения (получения) данных из файла

ReadWrite

Для записи в или чтения из файла

Write

Для записи данных в файл

ТекстовыеЗаписьданныев текстовыйили любуюфайлдругуюприинформациюпомощи классаможноStreamWriterзаписать в файл используя метод CreateText() в классе FileInfo. Однако предварительно необходимо получить правильный StreamWriter. Именно StreamWrite обеспечивает необходимую функциональность для записи в файл. Следующий пример иллюстрирует это:

FileInfo f = new FileInfo("Mytext.txt")

StreamWriter w = f.CreateText(); w.WriteLine("Первая строка"); w.WriteLine("Вторая строка"); w.WriteLine("Третья строка"); w.Write(w.NewLine);

w.Close();

Для чтения из текстового Чтениефайла можноиз текстовоговоспользоватьсяфайлаклассом StreamReader. Для этого необходимо указать имя файла в статическом методе OpenText() класса File. Следующий пример считывает содержимое файла, которое было записано в предыдущем примере:

Console.WriteLine("Читаем содержимое файла"); 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), для этого мы можем использовать следующий код:

10

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 так же можно указать кодировку, в которой будет текст.

3.Чтение и запись двоичных (бинарных) файлов.

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

При работе с файлами выполняются операции ввода - вывода. Операция ввода означает перепись данных с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода - это пересылка данных из основной памяти на внешнее устройство (в выходной файл). Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах

11