File (516215), страница 2
Текст из файла (страница 2)
Закрытие файла.
Закрытие файла, открытого для записи или чтения можно закрыть процедурой
CLOSE(<файловая переменная >);
При этом, вновь созданный файл регистрируется в каталоге. Так как любое обращение к диску осуществляется через буферную память, часть информации при обмене может остаться в буфере. Поэтому процедура закрытия файла обеспечивает дозапись оставшейся информации из буфера. Связь с файлом файловой переменной сохраняется. и при повторном использовании этого же файла применять процедуру ASSIGN еще раз не требуется.
Переименование файла.
Любой существующий файл можно переименовать, используя процедуру
RENAME(<файловая переменная >,<новое имя >);
Если в процессе работы программы требуется переименовать файл, открытый для чтения или записи, необходимо предварительно закрыть этот файл. При совпадении нового имени файла с каким-либо уже существующим выдается сообщение об ошибке.
Удаление файла.
Уже созданный или находящийся в процессе формирования файл может быть уничтожен с помощью процедуры
ERASE(<файловая переменная >);
Перед уничтожением файл должен быть закрыт, так как удаляются только закрытые файлы.
Определение конца файла.
Как было отмечено, размер файла при его заранее не определяется. Поэтому в процессе работы требуется проверка достижения конца файла. Это позволяет определить логическая функция, тестирующая конец файла
EOF(<файловая переменная >);
Функция принимает значение TRUE если указатель стоит на конце файла (после последней записи). При этом, если ведется чтение то такое значение функции означает, что файл исчерпан, а если идет запись, то она происходит в конец файла. Функция принимает значение FALSE, если конец файла при проверке еще не достигнут.
Получение информации об операции ввода-вывода
Система ввода-вывода регистрирует правильность выполнения ошибок операций работы с файлами. Эта информация может быть получена и обработана пользователем в режиме компилятора {$I-} (отключение контроля ввода-вывода) с помощью функции
IORESULT.
В качестве своего результата функция возвращает значение типа word, содержащее 0, если операция была успешной, и равная коду ошибки, если таковая произошла (приложение 1).
Процедуры работы с каталогами.
В соответствии с файловой системой, имя каталога входит в идентификацию файла, поэтому Турбо-Паскаль имеет средства для создания, уничтожения и других действий с каталогами.
-
CHDIR(<путь>) - процедура изменения текущего каталога. Устанавливает каталог, указанный параметром «путь».
-
GETDIR(<устройство>,<каталог>) - процедура позволяет определить имя текущего каталога на указанном устройстве.
<устройство> - 0- устройство по умолчанию;
1 - диск А;
2 - диск В.
<каталог> - переменная типа string, которая передает путь к текущему каталогу.
-
MKDIR(<каталог>) - процедура создает новый каталог, где «каталог» содержит путь и новое имя.
-
RMDIR(<каталог>) - процедура удаляет каталог с указанным именем. Каталог должен быть пустым.
-
Пример 2-3. Использование стандартных процедур при создании резервной копии.
program copir;
var fi,fo:text;{ файл ТИПА text }
k,i:word;
name, ; { имя файла для которого создается копия }
name_bak,s: string; ; { имя для копии файла }
const bak='.bak';
begin
writeln(' введите имя файла для редактирования');
readln(name);
k:=pos('.',name); { длина имени с точкой - <имя>.}
if k=0 then k:=length(name)+1; { длина имени без расширения - <имя> + ' '}
{формируем новое имя <имя>.BAK ,убрав точку или пробел}
name_bak:=copy(name,1,k-1)+bak;
assign(fi,name);
{$I-} reset(fi);{$I+} { проверка наличия файла с именем name}
if ioresult <> 0 then begin
writeln(#7,' нет файла с именем ',name);halt;
end;
close(fi);
assign(fo,name_bak); { проверка наличия файла с именем name_bak}
{$I-} reset(fo);{$I+}
if ioresult = 0 then begin
writeln(#7,' файл с именем ',name_bak,' есть ');
close(fo); { удаление файла с именем name_bak}
erase(fo) end;
rename(fi,name_bak); { создание резервной копии}
reset(fi);
assign(fo,name);
rewrite(fo);
while not eof(fi) do { пока не конец файла}
begin
readln(fi,s);
writeln(fo,s); { в этой точке возможен вызов процедуры редактирования файла }
end;
close(fi);
close(fo)
end.
2.3.Процедуры и функции из библиотеки DOS для работы с файлами
Borland Pascal предоставляет пользователю возможность воспользоваться процедурами и функциями библиотеки DOS. Для этого необходимо в начале программы подключить библиотеку с помощью директивы USES DOS, чтобы сделать доступными ее компоненты, представленные в этом разделе.
-
Функция DISKFREE(<диск>); определяет и возвращает объем свободного места на указанном диске в байтах . Тип результата LONGINT.
Параметр функции <диск> может принимать значение:
0 - устройство по умолчанию:
1 - диск А:
2 - диск В:
-1 - не существующий диск.
-
Функция DISKSIZE(<диск >): возвращает полный объем указанного диска в байтах. Параметр <диск > принимает такое значение, как и в предыдущей функции.
-
Процедура GETTIME(<файловая переменная>,<время>); возвращает время создания или последнего обновления файла
<время> - переменная типа LONGINT, в которой возвращается время в упакованном формате для файла, определенного в параметре <файловая переменная>.
-
Процедура UNPACKTIME(<время>,<дата>); позволяет распаковать параметр <время>, представленный в виде целого числа LONGINT, в тип DATATAPE, который описан в модуле следующим образом:
Type DATATAPE = record
year : word; {19xx}
month: word; {1..12}
day: word; {1..31}
hair: word; {0..23}
min: word; {0..59}
sec: word; {0..59}
end;
Этот формат представляет время в привычном для пользователя виде.
-
Процедура SETFTIME(<файловая переменная>,<время>) используется для установки новой даты создания или обновления файла, описываемого файловой переменной.
-
<время> время и дата для установки в упакованном формате, представленные в виде целого числа LONGINT.
-
Процедура PACKTIME(<дата>,<время>) позволяет упаковать параметр <дата>, представленный в виде, привычном для пользователя, и описанный с помощью переменной типа DATATAPE в целое число LONGINT, присваиваемое параметру <время>.
-
Процедура GETFATTR(<файловая переменная>,<атрибуты>) применяется для получения атрибутов файла, указанного файловой переменной.
<атрибуты> переменная типа WORD, в младшем байте которого возвращаются атрибуты файла. Для расшифровки байта атрибутов в модуле описана константа следующего содержания:
Const Readonly = $01; только чтение
Hidden = $02; скрытый файл
Sysfile = $04; системный файл
VolumeID =$08; идентификатор тома
Duirectory = $10; имя подкаталога
Archive = $20; архивный файл
Anyfile = $3F; любой файл
Комбинация битов в байте может указывать самые разные варианты.
Процедура SETFATTR(<файловая переменная>,<атрибуты>) служит для установки атрибутов файла указанного файловой переменной.
<атрибуты> переменная типа WORD, в младшем байте которого передаются процедуре атрибуты файла.
-
Функция FSEARCH(<имя>,<список каталогов>) Ищет файл в списке каталогов.
<имя> - имя отыскиваемого файла ( строковое выражение типа PATCHSTR=STRING[79] ; имени может предшествовать путь).
<список каталогов> - список каталогов, в которых ищется файл ( строковая переменная типа STRING ) ; имена каталогов разделяются запятой.
Результат поиска возвращается в виде строки типа PATCHSTR=STRING[79]. В строке содержится путь и имя файла, если поиск был успешным. В противном случае возвращается пустая строка.
-
Функция FSPLIT(<файл>,<путь >,<имя>,<расширение>) применяется для расщепления имени файла, т. е. Возвращает в качестве отдельных параметров путь к файлу, его имя и расширение;
<файл> - строковое выражение, содержащее спецификацию файла
<путь> - переменная типа PATCHSTR=STRING[67], в котором возвращается путь к файлу;
<имя> - переменная типа PATCHSTR=STRING[8], в котором возвращается имя файла;
<расширение> - переменная типа PATCHSTR=STRING[4], в котором возвращается расширение с предшествующей ему точкой;
Процедура не проверяет наличие на диске указанного файла. В качестве входного параметра может использоваться переменная типа PATCHSTR=STRING[79].
-
Функция FEXPAND(<файл>) применяется для дополнения файлового имени до полной спецификации (с указанием устройства и пути);
<файл> - строковое выражение или переменная типа PATCHSTR.
Функция не проверяет наличие файла на диске, а просто дополняет имя файла недостающими параметрами. Результат возвращается в строке типа PATCHSTR=STRING[79].
-
Пример 2-4. Использование процедур и функций DOS.
program fundos; { проверка функций библиотеки dos}
uses dos,crt;
const name:string='c:\tanya\pasc\filezap\pr.rez';
var fi,fo:text;{ файл ТИПА text }
k,i:word;time,size:longint; {переменные для хранения времени и размеров}
date:datetime; {переменные для преобразования даты}
pathf:dirstr; { описываются как стандартные типа модуля dos }
namef:namestr;
extf:extstr;
atr:byte; {переменные для хранения байта атрибутов файла}
begin
clrscr;
writeln(' введите имя файла для работы ');
readln(name);
assign(fi,name);
{$I-} reset(fi);{$I+} { проверка наличия файла с именем name}
if ioresult <> 0 then begin
writeln(#7,' нет файла с именем ',name);halt;
end;
getftime(fi,time); {процедура определения даты создания файла}
unpacktime(time,date); {процедура преобразования даты в понятный вид}
writeln('дата создания файла =',date.year:5,date.month:3,date.day:3);
writeln('время создания файла =',date.hour:3,date.min:3,date.sec:3);
with date do begin
year:=1998;
month:=7;
day:=31
end;
packtime(date,time); {упаковка даты для внесения изменений в тип longint }
setftime(fi,time); {установка новой даты создания или корректировки файла}
writeln(' после установки новой даты ');
writeln('дата создания файла =',date.year:5,date.month:3,date.day:3);
writeln('время создания файла =',date.hour:3,date.min:3,date.sec:3);