16.4.5. Анализ имен файлов

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:DOS33SYS.COM'

'C:DOS33'

'SYS'

'.COM'

'BILL.EXE'

''

'BILL'

'.EXE'

'GAMESDIGGER'

'GAMES'

'DIGGER'

''

'GAMESDIGGER'

'GAMESDIGGER'

''

''

'A:FILE.COM'

'A:'

'FILE'

'.COM'

В некоторых случаях возможна неоднозначная трактовка параметра X. Так, в примере с 'GAMESDIGGER' подстрока 'DIGGER' может быть и именем файла, и именем подкаталога.

Процедура FSplit никогда не запрашивает диск, чтобы разобраться в подобных проблемах. Она просто считает последнее слово после символа '' в строке именем файла. Если подразумевается, что DIGGER — имя подкаталога, то надо дописывать символ разделения каталогов.

- 368 -

16.4.5.2. Функция FExpand( X : PathStr ) : PathStr. Действие функции состоит в приведении строки X к полному имени файла, причем к какому именно, зависит от значения X.

Если X — просто имя файла или имя файла с указанием его подкаталога относительно текущего местонахождения, то функция допишет к X полный маршрут текущего положения. Но если X уже содержит полное имя, то оно просто перепишется заглавными буквами без добавления маршрута. Сказанное выше иллюстрируется табл. 16.5 (считается, что текущий каталог — C:TEST):

Таблица 16.5

Пример вызова

Возвращаемое значение

... :=Fexpand( 'test.txt' )

'C:TESTTEST.TXT'

... :=Fexpand( '..DEMOd.pas' )

'C:DEMOD.PAS'

... :=Fexpand( '..auto.bat ' )

'C:AUTO.BAT'

... :=Fexpand( 'LEXout.txt ' )

'C:LEXOUR.TXT'

... :=Fexpand( '' )

'C:'

... :=Fexpand( '' )

'C:

... :=Fexpand( 'SUBDIR' )

'C:TESTSUBDIR'

... :=Fexpand( 'A:LEXour.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

- 369 -

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