Страница 22 из 41
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 ;уход на обработку ошибки |