Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика / Метод_Работа_с_файлами.doc
Скачиваний:
89
Добавлен:
09.06.2015
Размер:
1 Mб
Скачать

28 Введение

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

Файл – обладает признаками:

  1. фиксированное имя (последовательность символов однозначно характеризующее файл)

  2. определенное логическое представление и соответствующие ему операции чтения/записи

В зависимости от файловой системы, файл может обладать различным набором свойств:

  1. Имя файла: ограниченно 255 символами

  2. Расширение имени файла - последовательность символов, добавляемых к имени файла и предназначенных для идентификации типа (формата) файла. Расширение обычно отделяется от основной части имени файла точкой, например .doc,.rar. В ранних операционных системах длина расширения была ограничена тремя символами, в современных операционных системах это ограничение отсутствует. Иногда могут использоваться несколько расширений, следующих друг за другом, например, «.tar.gz».

  3. Атрибуты

Например: атрибут READ ONLY говорит о том, что файл предназначен только для чтения, записывать в файл запрещено, Атрибут SYSTEM , что значит, системный, критический для работы операционной системы файл, атрибут HIDDEN скрытый файл скрывается от показа, пока явно не сказано обратное, ARCHIVE - архивный (требующий архивации) файл изменён после резервного копирования или не был скопирован программами резервного копирования.

  1. Время - Для файла могут быть определены следующие временные метки:

- Время создания

- Время модификации

- Время последнего доступа

  1. Владелец и группа файла

Лабораторная работа №1.

Работа с файлами в Delphi.

Цель работы

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

Постановка задачи

  1. Написать программу в среде Delphi, выполняющую расчет функции Y(X) . Полученные значения Х и Y записать в текстовый файл.

Содержание отчета

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

Краткие теоретические сведения

Для упрощения и прозрачности доступа к файлам в файловой системе выделяются такие логические понятия, как каталог (папка, Folder, директория) и диск. Для работы с файлами, каталогами и дисками необходимо наличие в разделе uses модулей System и SysUtils .

Большинство функций, описанных в модулях System и SysUtils, являются логическими. По значению, которое они возвращают, определяется успешность выполнения операции. Если значение равно true, то считается, что операция прошла успешно.

Для обращения к дисковым накопителям используются буквы латинского алфавита (A..Z). Логический диск представляет собой именованную область дискового пространства, которая обладает следующими параметрами:

  • имя, по которому к нему можно обратиться;

  • полный объем;

  • объем свободного пространства.

Для доступа к текстовым файлам используется переменная типа TextFile. Чтобы ассоциировать файл на диске с переменной надо проделать следующие операции:

1) Определить файловую переменную:

var f:TextFile;

2) Ассоциировать ее:

AssignFile(F, 'c:\MyFile.txt');

3) Теперь надо этот файл открыть, есть 3 варианта:

- файла нет или он должен быть перезаписан, открытие для записи:

Rewrite(f)

- файл есть и его надо открыть для чтения (с первой строки)

Reset(f)

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

Append(f). (Процедура Append предназначена для открытия текстового файла и добавления записей в файл (запись добавляется в конец файла))

Возможно следующие действия с файлом:

- Перезаписать весь файл

- Читать с первой строки

- Дописать что-то в конец

- Читать и писать файл целиком.

Рассмотрим пример: пусть у нас есть строковая переменная s для чтения строки из файла.

Чтение предварительно открытого файла:

ReadLn(f, s) - будет прочитана текущая строка, и позиция чтения переведена на следующую позицию.

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

While not eof(f) do

begin

ReadLn(f, s);

{здесь делаем что-то с прочитанной строкой}

end;

Для записи целой строки существует функция:

Writeln(f,s);

Запись части строки (те следующая операция записи будет произведена в ту же строку) производиться с помощью функции:

Write(f,s);

Если переменная s содержит больше 255 символов (т.е. является длинной строкой), то в файл вместо строки попадут 4 байта указателя на нее. Поэтому необходимо использовать тип pointer, который определяет общее использование указателя на любые данные, основанные на памяти. Таким образом, функция записи для длинной строки выглядит следующим образом:

Writeln(f,pointer(s)^).

Различают типизированные и нетипизированные файлы.

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

Объявляем файл байтов:

var f:file of byte;

b:Byte;

//Ассоциируем файловую переменную с физическим файлом:

AssignFile(f,'c:\myfile.bin');

//Теперь мы можем либо перезаписать/создать файл:

Rewrite(f);

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

Reset(f);

//Обратите внимание, что функция Reset хотя и имеет такой же формат, как и для текстовых файлов, но открытый ей файл можно и читать и писать, в отличие от текстовых.

Теперь рассмотрим функции работы с файлом:

read(f,b); - прочитать 1 байт

write(f,b); - записать 1 байт

seek(f,100); - поставить текущее положение считывания/записи на сотый байт

Size(f); - прочитать количество байт в файле.

Eof(f); - узнать не являетсмя ли байт последним

Все эти функции не работают с файлами большими 2 Gb.

После работы файл надо закрыть:

CloseFile(f);

Приведенные выше механизмы будут работать с любым файлом, так как любой файл можно считать файлом байтов.

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

Для работы с нетипизированными файлами используют процедуры BlockRead и BlockWrite.

Процедура BlockWrite используется для записи RecordCount записей данных из Buffer в нетипизированный двоичный файл.

Процедура BlockRead используется для чтения RecordCount записей данных в Buffer из нетипизированного двоичного файла, данного FileHandle.

Пример: провести чтение данных от двоичного файла по одному байту за один раз.

var

myFile : File;

byteArray : array[1..8] of byte;

oneByte : byte;

i, count : Integer;

begin

// Попытка открыть файл Test.byt для записи

AssignFile(myFile, 'Test.byt');

ReWrite(myFile, 4); // Определение отдельной 'записи' как 4 байта

// Заполнение массив данными

for i := 1 to 8 do

byteArray[i] := i;

// Запись данных массива в файл

BlockWrite(myFile, byteArray, 2); // Запись 2 'записи' из 4 байт

//Закрытие файла

CloseFile(myFile);

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

FileMode := fmOpenRead;

Reset(myFile, 1); // Теперь мы определяем одну запись как 1 байт

// Показ содержимого файла

// Чтение первых 6 байт. 'count' установлен в

// текущий считанный номер

ShowMessage('Чтение первого набора байтов :');

BlockRead(myFile, byteArray, 6, count);

// Показ считанных значений байта

for i := 1 to count do

ShowMessage(IntToStr(byteArray[i]));

// Теперь читаем один байт за один раз и так до конца файла

ShowMessage('Чтение остающихся байтов :');

while not Eof(myFile) do

begin

BlockRead(myFile, oneByte, 1); // Чтение одного байта за один раз

ShowMessage(IntToStr(oneByte));

end;

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

CloseFile(myFile);

end;

Так же для работы с нетипизированными файлами используются следующие функции:

Erase(f) - удаляет файл

FilePos(f) - возвращает текущую позицию чтения/записи в файл

Flush(f) - сбрасывает кэшированные файловые операции на диск

Rename(f, 'MyNewFileName.txt') - переименование файлов

Truncate(f) - файл обрезается до текущей позиции чтения/записи.

Delphi предоставляет довольно широкие возможности по файловым операциям без использования механизмов открытия/закрытия файлов.

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

ChDir(NewCurrentPath: string); - изменяет текущий каталог; прочитать же текущий каталог можно функцией GetCurrentDir, а текущий каталог для определенного драйва - GetDir.

CreateDir(const Dir: string): Boolean; - создает каталог, при этом предыдущий уровень должен присутствовать.

Если вы хотите сразу создать всю вложенность каталогов используйте функцию ForceDirectories(Dir: string): Boolean; Обе функции возвращают True, если каталог создан.

DiskFree(Drive: Byte): Int64; - дает свободное место на диске. Параметр - номер диска 0 = текущий, 1 = A, 2 = B, и так далее

DiskSize(Drive: Byte): Int64; - размер жесткого диска.

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

FileExists(const FileName: string) - применяется для проверки наличия файла

FileGetAttr(const FileName: string): Integer;

FileSetAttr(const FileName: string; Attr: Integer): Integer; - функции для работы с атрибутами файлов, где FileName – имя файла, Attr- атрибуты.

Список возможных атрибутов:

faReadOnly $00000001 Read-only files

faHidden $00000002 Hidden files

faSysFile $00000004 System files

faVolumeID $00000008 Volume ID files

faDirectory $00000010 Directory files

faArchive $00000020 Archive files

faAnyFile $0000003F Any file

(Естественно не все атрибуты применимы во всех случаях)

RemoveDir(const Dir: string): Boolean; - удаляет папку(пустую)

DeleteFile(const FileName: string): Boolean; - удаляет файл

RenameFile(const OldName, NewName: string) - переименовывает файл.

Функция IOResult возвращает результат последней операции ввода/вывода. Если операция завершилась нормально, то это число 0, положительное число - если операция потерпела неудачу.

Функция IOResult используется после отключения функции проверки ошибок:{$IOChecks off}. Когда $IOChecks включено, Delphi выдает исключения для ошибок. Когда выключено, Delphi не выдает исключения, требуя, чтобы код сам следил за результатом ввода/вывода IOResult.

Рассмотрим пример: создать каталог дважды с перехватом кода ошибки.

var

error : Integer;

begin

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

// Выключение проверки ошибок I/O

{$IOChecks off}

MkDir('TempDirectory');

// Каталог создался успешно?

error := IOResult;

if error = 0

then ShowMessage('Каталог создался успешно')

else ShowMessageFmt('Создание каталога провалилось с ошибкой %d',[error]);

// Попытка снова создать каталог - она провалится!

MkDir('TempDirectory');

error := IOResult; // Сохраняем возвращаемый код

if error = 0

then ShowMessage('Каталог снова создался успешно')

else ShowMessageFmt('Повторное создание каталога провалилось с ошибкой %d',[error]);

// Удаление каталога для очистки

RmDir('TempDirectory');

// Включение проверки ошибок I/O

{$IOChecks on}

end;