
- •28 Введение
- •Лабораторная работа №1.
- •Лабораторная работа №2.
- •Лабораторная работа №3.
- •Лабораторная работа №4.
- •Содержание отчета
- •Краткие теоретические сведения
- •Лабораторная работа №5. Работа с цветными изображениями в пакет mathcad Цель работы
- •Постановка задачи
- •Содержание отчета
- •Краткие теоретические сведения
- •Варианты заданий
- •Литература
28 Введение
Основным носителем информации является файл. Файлы организованы в системе не хаотическим образом, а виде определенной структуры, получившей название файловой системы.
Файл – обладает признаками:
фиксированное имя (последовательность символов однозначно характеризующее файл)
определенное логическое представление и соответствующие ему операции чтения/записи
В зависимости от файловой системы, файл может обладать различным набором свойств:
Имя файла: ограниченно 255 символами
Расширение имени файла - последовательность символов, добавляемых к имени файла и предназначенных для идентификации типа (формата) файла. Расширение обычно отделяется от основной части имени файла точкой, например .doc,.rar. В ранних операционных системах длина расширения была ограничена тремя символами, в современных операционных системах это ограничение отсутствует. Иногда могут использоваться несколько расширений, следующих друг за другом, например, «.tar.gz».
Атрибуты
Например: атрибут READ ONLY говорит о том, что файл предназначен только для чтения, записывать в файл запрещено, Атрибут SYSTEM , что значит, системный, критический для работы операционной системы файл, атрибут HIDDEN скрытый файл скрывается от показа, пока явно не сказано обратное, ARCHIVE - архивный (требующий архивации) файл изменён после резервного копирования или не был скопирован программами резервного копирования.
Время - Для файла могут быть определены следующие временные метки:
- Время создания
- Время модификации
- Время последнего доступа
Владелец и группа файла
Лабораторная работа №1.
Работа с файлами в Delphi.
Цель работы
Изучение способов обмена информацией, поиск данных в файлах, стандартных процедур и функций, предназначенных для работы с файловой системой.
Постановка задачи
Написать программу в среде 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;