Сборник по задачам и примерам Assembler

       

Работа с дисками, каталогами и организация поиска файлов



Работа с дисками, каталогами и организация поиска файлов



Работа с дисками, каталогами и организация поиска файлов

Win32 располагает большим набором функций для получения информации о структуре файловой системы конкретного компьютера. Часть этих функций раз-вивает идеи работы с файловой подсистемой, появившиеся в последних версиях WAS DOS. Другие функции являются уникальными для платформы Win32. Рас-Рассмотрим наиболее интересные из них.

Программа, предназначенная для исследования файловой системы, прежде всего должна знать, какие логические диски присутствуют в системе. Среди

нескольких функций, выполняющих эту работу, наиболее удобной для процесса обработки является GetLogicalDrivesString.

DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR lpBuffer);

Данной функции передаются два параметра: lpBuffer — адрес буфера, в который помешаются имена корневых каталогов логических дисков, установленных в системе; nBufferLength — длина буфера, заданного указателем lpBuffer. В качестве возвращаемого значения функция формирует длину буфера, действительно необходимую для размещения строки с именами корневых каталогов логических дисков. Например, при наличии трех логических дисков структура заполненного буфера будет следующей: А:\0В:\0С:\0. Заметьте, что имена корневых каталогов разделены нулевыми байтами. Более эффективно вызывать эту функцию два раза: первый раз с нулевым значением первого параметра, при этом функция вернет потребное количество байт для размещения буфера; второй раз функцию уже можно вызывать, подставив на место первого параметра значение, возвращенное при первом вызове.

:prg07_33.asm - Win32-консольное приложение для Win32 для исследования работы :функции GetLogicalDriveStrings API Win32.

.data

TitleText db 'Получение информации о дисках в Win32',0 '

infojmf db 10 duo (0)

.code



:.......----GetLogi cal Dri veStri ngs................-........

push offset info_buf

push 0

call GetLogicalDriveStringsA

cmp eax.O

jz exit ;выход в случае неудачи

;вызываем функцию второй раз. когда известно количество байт, потребное :для записи списка корневых каталогов




push offset info_buf

push eax

call GetLogicalDriveStringsA

cmp eax.O

jz exit :выход в случае неудачи результат смотрим в отладчике TD32.exe

Недостаток функции GetLogi cal Dri veStri ngs состоит в том, что она работает не во всех версиях Windows. Альтернативным вариантом получения информации о наличии дисков в системе является функция GetLogi cal Drives.

DWORD GetLogicalDrives(VOID);

Эта функция возвращает в регистре ЕАХ битовую маску, в которой установленные биты указывают на существование логического диска: бит 0 — А, бит 1 — В, бит 2 — С... Таким образом, с помощью функции GetLogi cal Drives можно достичь того же самого результата, что и с помощью функции GetLogi cal Dri veStri ngs, но несколько большими трудами.

;prg07_34.asm - Win32-консольное приложение для исследования

;работы функции GetLogicalDrives API Win32.

.data

TitleText db 'Получение информации о дисках в Win32'.0

info_buf db 10 dup (0)

.code

call GetLogicalDrives cmp eax.O

jz exit ;выход в случае неудачи результат смотрим з отладчике TD32.exe

После того как информация о номенклатуре логических дисков в системе получена, можно получить информацию о каждом из них. Для этого используется функция GetVolumelnformation.

BOOL GetVolumeInformation(LPCTSTR ipRootPathName.

LPTSTR lpvolumeNameBuffer. DWORD nVolumeNameSize, LPDWORD ipVolumeSerialNumber, LPDWORD
ipMaximumComponentLength. LPDWORD lpFileSystemFlags.

LPTSTR ipFileSystemNameBuffer. DWORD nFileSystemNameSize);

На вход функции GetVolumelnformation подаются следующие параметры:

  • IpRootPathName — указатель на строку с именем корневого каталога диска, информацию о котором необходимо получить (если параметр равен NULL, функция формирует информацию о текущем диске). Формат задания имени корневого каталога диска — имя_диска:\. Это единственный параметр, значение которого нужно задавать, остальные параметры — адреса областей памяти, в которые будут помещены значения, формируемые функцией;


  • lpVolumeNameBuffern и nVolumeNameSize — указатель на буфер и размер буфера, в который будет записано имя диска;




  • IpVolumeSerial Number — адрес двойного слова, куда будет записан серийный номер. Если информация о серийном номере диска не нужна, то при вызове функции значение этого параметра необходимо сделать равным NULL;


  • lpMaximumComponentLength — адрес двойного слова, куда будет записано значение максимальной длины пути, возможное в данной файловой системе;


  • lpFileSystemFlags — флаги с дополнительной информацией о файловой системе:


    • • FS_CASE_SENSITIVE=FILE_CASE_SENSITIVE_SEARCH

      =00000001h - поддержка со стороны файловой системы поиска с сохранением регистра букв;


    • • FS_CASE_IS_PRESERVED=FILE_CASE_PRESERVED_NAMES

      =00000002h - при записи на диск сохранить регистр букв в имени файла;


    • • FS_UNICODE_STORED_ON_DISK=FILE_UNICODE_ON_DISK

      =00000004h - файловая система поддерживает хранение имен файлов в Unicode;


    • • FSPERSI STENT_ACLS=FI LEPERS I STENT_ACLS

      =00000008h - файловая система способна оперировать со списками контроля доступа (ACL) — только для NTFS;

      • FS_FILE_COMPRESSION=FILE_FILE_COMPR?SSION

      =00000010h — файловая система поддерживает сжатие файлов;

      • FS_VOL_IS_COMPRESSED=FILE_VOLUME_IS_COMPRESSED

      =00008000h - том, о котором запрашивается информация, был сжат;

      a lpFileSystemNameBuffer и nFileSystemNameSize — указатель и размер буфера в который будет записано имя файловой системы. Если TpFiieSystemName-Buffer=NULL, то в эти параметры ничего не записывается.


    • Изменить метку диска может вызов функции SetVolumeLabel.

      BOOL SetVolumeLabel(LPCTSTR IpRootPathName. LPTSTR lpVolumeName):

      Параметр IpRootPathName задает адрес строки с именем корневого каталога диска, метку которого меняем. Второй параметр 1 pVol umeNarae — строка с меткой тома. Для удаления метки тома с диска параметр lpVolumeName нужно задать равным NULL.


      Содержание раздела