Процедуры и функции библиотеки DOS для работы с файлами

Лабораторные работы №15

Тема: Работа с нетипизированными файлами.

Цель: Развить навыки обработки нетипизированных файлов.

Оборудование и материалы: Методическое пособие, ПЭВМ, ручка, карандаш, линейка, ластик, шаблон А4.

Ход работы

Методические рекомендации.

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

Решение задач представить в следующем порядке: постановка задачи, построение математической модели, программный код, тестирование.

Задание для лабораторной работы выбрать согласно варианту по приведённой таблице. Вариант определяется порядковым номером в журнале группы.

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

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

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

ReWrite(Var f; [recsize:word])

ReSet (Var f; [recsize:word]).

Длина записи recsize - положительное число, не превышающее 65535 байт. Для обеспечения максимальной скорости обмена данными следует за­давать длину, которая была бы кратна размеру сектора диска (512 байт), на­пример: 1024,2048.

При работе с нетипизированными файлами можно использовать все процедуры и функции, предназначенные для работы с типизированными файлами, за исключением процедур Read и Write, Эти процедуры заменяют­ся высокоскоростными процедурами BlockRead и BlockWrite.

1. Процедура BlockRead(Var f:file;Var buf; Count:word [;res:word) - осуществляет чтение блока записей из файла в буфер.

Параметр buf определяет буфер, который будет участвовать в обмене данными. Размер буфера должен быть достаточен для размещения Count за­писей указанной в процедуре ReSet длины.

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

2. Процедура BlockWrite(Var f:file; Var buf; Count:word [;res:word) - осуществляет запись блока из буфера buf в файл.

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

Program copir;

Const recs=1024; {размер записи}

Var fi, fo: file; { нетипизированные файлы}

buf: array [1..2*recs] of byte; {буфер на 2048 байт} i: word;

namein,nameoutl: string;

Begin

WriteLn( 'Введите имя файла - источника: ' );

Readln ( namein );

{проверка наличия файла с указанным именем}

Assign ( fi, namein );

{$I-}

ReSet( fi,1 ); (открываем файл для чтения}

{$I+}

If lOResult <> 0 then begin

WriieLn(#7, ' Не существует факш с именем ‘,namein);

Halt

end;

WriteLnf 'Введите имя файла - приемника '); ReadLn (nameout);

Assign(fo,nameout);

ReWrite(fo,1); {открываем файл для записи} while not EOFtfi) do

Begin

BlockRead(fi,buf,siz.eof(buf),i); {читаем блок из входного файла} BlockWrite(fo,buf,i); {пишем блок из буфера в выходной файл} end;

Close(fi);

Close(fo)

End.

Процедуры и функции библиотеки DOS для работы с файлами.

Borland Paskal предоставляет программисту возможность обращения к некоторым функциям MS DOS, обеспечивающим функционирование файловой системы. Для этого необходимо в начале программы подключить библиотеку DOS с помощью директивы Uses Dos, чтобы сделать доступными ее ресурсы, описанные в этом разделе.

Для работы с файлами библиотека Dos содержит следующие процедуры и функции.

1. Функция DiskFree(drive:byte):LongInt - определяет и возвращает объем свободного места на диске drive в байтах. Параметр drive можетпринимать значения:0- устройство по умолчанию, 1- диск А, 2- диск В и т. д.

2. Функция DiskSize(drive:byte):LongInt - возвращает полный объем указанного диска в байтах. Параметр drive принимает те же значения, как и в предыдущей функции.

3. Процедура GetFTime(Var f; Var Time: LongInt) - возвращает время создания или последнего обновления указанного файла f. Время возвращается в упакованном формате, который необходимо распаковать.

4. Проседура UnPackTime (time: LongInt; Var DT:DateTime) - распаковывает значение параметра time, который содержит время в упакованном формате, в специальный тип DateTime, описанный в модуле Dos следующим образом:

Type DateTime=record

Year: word; {год}

Month: word; {месяц:1..12}

Day: word; {число:1...31}

Hair: word; {часы:0..23}

Min: word; {минуты:0..59}

Sec: word; {секунды:0…59}

End;

5. Процедура PackTime(DT:DateTime; Var time: LongInt) - позволяет упаковать параметр DT типа DateTime в целое число time.

6. Процедура SetF Time(Var f; time: LongInt) - используется для установки даты создания или обновления файла; time+ время и дата в упакованном формате.

7. Процедура GetFAttr(Var f; Var Attr: word) - применяется для получения атрибутов файла, указанного файловой переменной. Атрибуты файла («только чтение», «скрытый», «системный» и т. д.) кодируются битами байта атрибутов файла. Комбинация битов в байте может указывать самые рпзные варианты. Байт атрибутов возвращается в младшем байте параметра Attr.

Для расшифровки байта атрибутов в модуле Dos описаны специальные маски длиной 1байт:

Const Readonly = S01; {только чтение}

Hidden = $02; {скрытый файл}

Sysfile = $04; {системный файл}

VolumelD = $08; {идентификатор тома}

Directory = $10; {имя подкаталога}

Archive = S20; {архивный файл}

Anyftle = S3F; {любой файл}

Для того чтобы определить, установлен или нет соответствующий бит, используют

фрагменты, аналогичные следующему:

GetFAttrffAttrF);

if Lo(AttrF) && Readonly <>0 then

WriteLn('Файл имеет атрибут "только чтение"')

8. Процедура SetFAttr(Var f; Attr:word) - служит для установки атрибу­тов файла указанного файловой переменной.

9. Функция FSearch(path:PathStr; DirLisl:string):PathStr возвращает путь к файлу, заданному в строке path, который ищется в указанном списке каталогов; имена каталогов в списке должны быть разделены точкой с запя­той «;». Если файл не найден, то возвращается пустая строка.

10. Процедура FSplit(path:PathStr; Var Dir:DirStr; Var name:NameStr;Var Ext:ExtStr) - осуществляет расщепления имени файла, заданного в path, т. е. возвращает в качестве отдельных строк путь к файлу dir, его имя name и расширение ext. Процедура не проверяет наличие на диске указанного фай­ла.

11. Функция FExpand(path:PathSrt):PathStr - возвращает полное имя указанного файла. Функция не проверяет наличие файла на диске, а просто дополняет имя файла недостающими параметрами.

Пример 6.7. Разработать программу, которая обращается к функциям библиотеки Dos для:

­ определения и изменения даты создания файла;

­ определения атрибутов файла;

­ определения количества свободного места на диске.

 

Program fundos; { проверка функций библиотеки dos}

Uses dos, crt;

Var fi, fo:text; {текстовые файлы}

k,i: word; titne, size: longint; date: DateTime;

pathf: DirStr; namef: NameStr; extp:ExtStr;

atr: byte; {переменные для хранения байта атрибутов файла}

name: striag;

Begin

CIrScr;

WriteLn ('Введите имя файла:');

ReadLn (name);

Assign (fi.name);

{$I-} ReSet(fi);{$I+} {проверяем наличие файла с именем пате}

if IOResult <> 0 then

begin

WriteLn(#7, ' нет файла с именем ‘name’);

Halt;

end;

GetFTime(fi, time); (определяем дату создания файла} UnPackTime(lime, date); {распаковываем дату}

WriieLn ("Дата создания файла=',date.year:5,date.month:3, date.day:3); WriteLn('Время создания файла = '.date.hour:3,date.min:3.date.sec:3);

with date do

begin year: =2001; month: =3; day:=8 end; PackTime(date, time); {упаковываем дату}

SelFTime(fi, time); {меняем дату}

WriteLn ('После изменения даты:');

WriteLn (dama создания файла = ',date.year:5,date.month:3,date.day:3);
WritiLn('время создания файла =’date.hour:3,date.min:3,date.sec:3);
FSplit(name, pathf, nameJ, extf); {расщепляем имя файла}
WriteLп {'Полпое имя файла = ',pathf:25,namef:12,extf:8);
GetFAtlr(fi,k); {определяем атрибуты файла}

atr:=lo(k);

WriieLn (‘байт атрибутов ',atr);

size: = DiskFree (1);

WriteLn (‘Свободное место на диске А ‘,size: 10,' байт ');

Close(fi);

End..

Результат работы программы:

Введите имя файла: e:\iva\primer.pas\file\primer.txt

Дата создания файла = 2001 3 7

Время создания файла = 10 47 22

После изменения даты

дата создания файла = 2001 38

время создания файла = 10 47 22

Полное имя файла = c:\iva\primer.pas\flle\ primer .txt

байт атрибутов 32

Свободное место на диске Л 9104 байт

 

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

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: