16.4.5.1. Процедура FSplit( X : PathStr, VAR Dir : DirStr, VAR Name : NameStr, VAR Ext: ExtStr). Эта процедура служит для разбиения на части полного имени файла. Под полным именем мы понимаем конструкцию из маршрута на диске и собственно имени файла. Принимая на входе строку X, процедура разбивает ее на три подстроки соответствующих типов:
Dir — имя маршрута на диске;
Name — имя файла ( до восьми символов без точки );
Ext — точка и следующее за ней расширение.
Если при разборе строки X окажется невозможным выделить какой-либо ее компонент, то вернется значение '' (пустая строка). Примеры вызовов и их результаты можно увидеть в табл. 16.4.
Таблица 16.4
Значение X
Dir=
Name=
Ext=
‘C:\DOS33\SYS.COM’
‘C:\DOS33\’
‘SYS’
‘.COM’
‘BILL.EXE’
‘’
‘BILL’
‘.EXE’
‘GAMES\DIGGER’
‘GAMES\’
‘DIGGER’
‘’
‘GAMES\DIGGER\’
‘GAMES\DIGGER\’
‘’
‘’
‘A:FILE.COM’
‘A:’
‘FILE’
‘.COM’
В некоторых случаях возможна неоднозначная трактовка параметра X. Так, в примере с 'GAMES\DIGGER' подстрока 'DIGGER' может быть и именем файла, и именем подкаталога.
Процедура FSplit никогда не запрашивает диск, чтобы разобраться в подобных проблемах. Она просто считает последнее слово после символа '\' в строке именем файла. Если подразумевается, что DIGGER — имя подкаталога, то надо дописывать символ разделения каталогов. {367}
16.4.5.2. Функция FExpand( X : PathStr ) : PathStr. Действие функции состоит в приведении строки X к полному имени файла, причем к какому именно, зависит от значения X.
Если X — просто имя файла или имя файла с указанием его подкаталога относительно текущего местонахождения, то функция допишет к X полный маршрут текущего положения. Но если X уже содержит полное имя, то оно просто перепишется заглавными буквами без добавления маршрута. Сказанное выше иллюстрируется табл. 16.5 (считается, что текущий каталог — C:\TEST):
Таблица 16.5
Пример вызова
Возвращаемое значение
... :=Fexpand( ‘test.txt’ )
‘C:\TEST\TEST.TXT’
... :=Fexpand( ‘..\DEMO\d.pas’ )
‘C:\DEMO\D.PAS’
... :=Fexpand( ‘..\auto.bat ’ )
‘C:\AUTO.BAT’
... :=Fexpand( ‘\LEX\out.txt ’ )
‘C:\LEX\OUR.TXT’
... :=Fexpand( ‘\’ )
‘C:\’
... :=Fexpand( ‘\\’ )
‘C:\\
... :=Fexpand( ‘SUBDIR\’ )
‘C:\TEST\SUBDIR\’
... :=Fexpand( ‘A:\LEX\our.txt’ )
Программа на рис. 16.11 показывает, как можно применить процедуру FSplit и функцию FExpand для написания заведомо «капризных» программ, которые работают только с файлами из текущего каталога.
USES DOS; { ПРИМЕР ОБРАБОТКИ ИМЕН ФАЙЛОВ }
VAR X, FullName : PathStr; Dir : DirStr ;
Name : NameStr; Ext : ExtStr ;
BEGIN
Write( 'Введите полное имя обрабатываемого файла: ' );
ReadLn( X );
FSplit(X, Dir, Name, Ext); { состав введенного имени }
X:=FExpand( X ); { перевод в верхний регистр }
if ( Dir=' ' ) or {He введен путь или же ка- }
(X<>FExpand(Name+Ext)) { талог при X - не текущий. }
then begin { Файл не оттуда! Конец. }
WriteLn( #10'Ошибка в имени'+
или попытка обмануть программу!' );
Halt end; { if }
... { работа с верным именем }
END.
Рис. 16.11 {368}
Не следует забывать, что параметры и переменные, стоящие в вызовах этих процедур, должны быть описаны соответствующими типами, хотя после вызовов с ними можно обращаться, как с обычными строками назначенной длины.