Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители - Переименование файла;  изменение позиции файла в каталоге

ОГЛАВЛЕНИЕ

     5.3.4 Переименование файла;  изменение позиции файла в каталоге.


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

   Высокий уровень.


   В Бейсике файл переименовывается командой NAME. С помощью этой
команды он может быть также перенесен  в другой каталог. Напишите
сначала существующее имя, а затем новое имя файла, оба  заключен-
ные в кавычки, например NAME  "OLDFILE.EXT"  AS "NEWFILE.EXT".  В
этом  случае  будет переименован файл в корневом  каталоге.   Для
изменения имен файлов,  расположенных  в подкаталогах, могут быть
использованы пути к файлу.  Например, NAME "B:LEVEL1\OLDFILE.EXT"
AS "B:LEVEL1\NEWFILE.EXT"  изменяет  имя  файла в подкаталоге LE-
VEL1.
   Отметим, что для нового имени файла должен быть указан  полный
путь.  Если Вы запишете  NAME  "B:LEVEL1\OLDFILE.EXT"  AS "NEWFI-
LE.EXT",  то файл будет не только переименован, но и перенесен  в
корневой каталог.  Для  переноса  файла  из  одного подкаталога в
другой  без изменения его имени напишите команду NAME "A:SUBDIR1-
\OLDFILE.EXT" AS  "A:SUBDIR2\OLDFILE.EXT".  Таким  методом нельзя
перенести файл с диска на диск.  Поскольку файлы, расположенные в
разных каталогах могут иметь одно и то же имя, то возможна ошибка
при попытке переноса файлов с одинаковыми именами.  В этом случае
будет возвращен код ошибки 58 [5.4.8].

   Средний уровень.


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

Метод FCB:
   Используйте функцию 17H прерывания 21H. DS:DX должны указывать
на открытый управляющий блок  файла.  Поместите новое имя файла в
FCB,  начиная  со смещения 11H (это "резервная"  область  блока).
Новое имя может использовать  символ  "?", в этом случае символы,
находящиеся  в этих позициях, не будут изменяться.  При возврате,
если новое имя уже существовало в каталоге, то AL будет равно FF,
иначе  AL  =  0.  В примере имя файла  ACCOUNTS.DAT  меняется  на
DEBTS.DAT.

;---в сегменте данных
FCB       DB      'FILENAMEEXT',25 DUP(0)
NEWNAME   DB      'NEWNAME EXT',   ;11 символов нового имени

;---помещаем новое имя файла в переменную NEWNAME
      MOV  SI,OFFSET NEWNAME   ;DS:SI указывают на новое имя
      MOV  AX,SEG FCB          ;ES:DI указывают на FCB
      MOV  ES,AX               ;
      MOV  DI,OFFSET FCB       ;
      ADD  DI,11H              ;начинаем со смещения 11H
      MOV  CX,11               ;имя файла содержит 11 символов

REP   MOVSB                    ;переносим 11 байтов
      LEA  DX,FCB              ;DS:DX указывают на FCB
      MOV  AH,17H              ;функция изменения имени
      INT  21H                 ;изменяем имя
      CMP  AL,0FFH             ;проверка на ошибку
      JE   RENAME_ERROR        ;уход на обработку ошибки

Метод дескриптора файла:

   Функция 56H прерывания 21H переименовывает и перемещает файлы.
DS:DX должны указывать на строку, дающую путь и имя переименуемо-
го  файла  (до 63-х символов) и завершающуюся символом  ASCII  0.
ES:DI должны указывать на вторую строку, которая дает новые имя и
путь файла.  Имена  накопителей,  если  они  присутствуют, должны
совпадать.   Если  пути различны, то файл переноносится в  другой
подкаталог.  Чтобы перенести файл без переименования надо во вто-
рой строке указать то же самое имя, но другой путь. При возврате,
если произошла ошибка,  то  устанавливается  флаг  переноса, а AX
будет содержать 3 - если один из путей не найден, 5 - при  ошибке
на диске и 17 - при попытке  переноса между разными накопителями.
В  примере  файл ACCOUNTS.DAT переносится из подкаталога GAINS  в
подкаталог LOSSES.

;---в сегменте данных
OLDPATH   DB   'A:GAINS\ACCOUNTS.DAT',0
NEWPATH   DB   'A:LOSSES\ACCOUNTS.DAT',0

;---изменение пути файла
   LEA  DX,OLDPATH          ;DS:DX указывают на старый путь
   MOV  AX,SEG NEWPATH      ;ES:DI указывают на новый путь
   MOV  ES,AX               ;
   MOV  DI,OFFSET NEWPATH   ;
   MOV  AH,56H              ;номер функции
   INT  21H                 ;переносим файл
   JC   ERROR_ROUTINE       ;уход на обработку ошибки