Работа с файлами в MS DOS (длинные имена)
Перечисленные выше функции работают в различных версиях "чистой" системы MS DOS, вплоть до версии 6.22 включительно. Операционные системы Windows 95/98/Mil также поддерживают свою версию MS DOS, которая имеет номер 7.0. Операционная система Windows 95/98/Mil организует для программ MS DOS специальную среду для работы, называемую сеансом DOS.
Система MS DOS 7.0, будучи созданной для работы в среде Windows 95/98/Mil, имеет в своем составе средства для работы с файловой системой Windows. Эта файловая система, как известно, отличается тем, что полное имя файла может достигать длины 255 символов. MS DOS 7.0 также умеет работать с длинными именами файлов. В данном разделе мы рассмотрим предназначенные для работы с файловой системой Windows средства среды MS DOS, работающей под управлением Windows.
Определить факт того, в какой системе работает программа, можно по результатам работы функций 30h – получить версию DOS (прерывания 21п) и 4аЗЗп (прерывания 2fh).
Вход: АН = 30h; AL = определяет значение, возвращаемое в ВН: 00h– OEM-номер (как для DOS 2.0-4.0x);01h – номер версии.
Выход: AL = главный номер версии; АН – младший номер версии; BL:CX = 24-битный серийный номер пользователя (необязательно).
:prg07_19.asm – программа демонстрации определения факта того.;в какой системе работает программа. .code ;…..определим номер версии ОС MS DOS mov al.00 movah.30h;номер функции DOS int21h;А1-главный номер версии. АН-младший номер версии jne exit;переход в случае ошибки
В регистрах AL и АН возвращаются главный и младший номера версии MS DOS. При функционировании под Windows эти номера равны 07h и Oah соответственно. Задание значения AL = 01 дает такой же эффект.
:prg07_20.asm – программа демонстрации определения факта работы в среде MS DOS 7.0. .code :-----определить факт работы в среде MS DOS 7.0 movax.4a33h;номер функции DOS int 2fh cmp ax, 0 jneexit;переход, если работа не в среде MS DOS 7.0
Последняя функция возвращает 0 для MS DOS версии 7.0 и выше. Установить факт того, что система поддерживает длинные имена файлов, можно вызовом функции 71a0h прерывания 21п – получить информацию о томе. Если она возвращает ошибку (CF = 1), то текущая файловая система не поддерживает длинных имен файлов. Для вызова этой функции необходимо указать корневой каталог тома, о котором необходимо получить информацию.
Вход: АХ = 71A0h; DS:SI – ASCIZ-имя корневого каталога тома, о котором необходимо получить информацию (например, "С:\"); ES:DI – буфер для имени файловой системы; СХ ¦= размер буфера, адрес которого задан в ES: DI (32 байта).
Выход: CF = 0 в случае успеха, следующие регистры установлены: ВХ = флаги файловой системы: 0 – при поиске учитывать регистр букв в именах файлов; 1 – сохранять регистр букв в элементах каталога; 2 – использование символов Unicode в именах каталогов и файлов; 3-13 – резерв (0); 14 – поддержка DOS-функций для длинных имен файлов; 15 – сжатый том; СХ = максимальная длина файловых имен (обычно 255); DX = максимальная длина пути (обычно 260); ES: DI – в буфере по этому адресу ASCIZ-имя файловой системы, например "FAT", "FAT32", "NTFS", "CDFS"; CF = 1 в случае неудачи, при этом АХ = код ошибки или AX=7100h, если функция не поддерживается.
В Windows 95/98 появились дополнительные возможности как самой файловой системы, так и средств по ее управлению. Основное нововведение – поддержка длинных имен файлов. Основа файловой системы та же – таблица разрешения файлов FAT, но любой файл в этой системе имеет два имени – длинное имя и его псевдоним, который соответствует формату 8.3. Данный псевдоним создается системой Windows 95/98 автоматически.
Нужно правильно понимать различие в способах использования длинных имен файлов в приложениях MS DOS и Win32. Приложения MS DOS получают до-ступ к длинным именам файлов с помощью дополнительных функций прерывания 21h. Приложения Windows используют для этого соответствующие функции API.
Длинное имя файла представляет собой ASCIIZ-строку длиной до 255 символов. Система формирует псевдоним для этого имени форматом 8.3 в соответствии со следующим правилом: берутся первые 6 символов длинного имени, после них добавляется символ тильда (∼), за тильдой ставится некий порядковый номер. Для первого имени формата 8.3 это 1. Если такой псевдоним уже существует, то порядковый номер очередного псевдонима будет на 1 больше. Расширение псевдонима формируется из первых трех символов расширения длинного имени (если оно существует). Если похожих имен много, то номер в псевдониме может быть двузначным, при этом первая (символьная) часть псевдонима сокращается до 5 символов, и т. д.