Иллюстрированный самоучитель по задачам и примерам Assembler

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

Определение и изменение текущего каталога

Аналогично принципам организации файловой системы MS DOS в Win32 также существует понятие текущего каталога, то есть каталога, в котором выполняются предыдущие операции по работе с файлами. В отличие от MS DOS понятие текущего каталога относится к текущему процессу. При запуске процесса текущим будет являться каталог, из которого этот процесс был запущен. Определяет текущий налог процесса функция GetCurrentDirectory.

RD GetCurrentDirectory(OWORD nBufferLength, LPTSTR ipBuffer);

Параметры TpBuffern и BufferLength определяют соответственно адрес и длину буфера, в который помещается путь с текущим каталогом (строка с завершающим нулем). Функция возвращает NULL в случае ошибки и число байтов, необходимо для записи данных в буфер, в случае удачного завершения. Завершающий нуль в возвращаемом функцией числе не учитывается. Если буфер мал, то с помощью возвращаемого значения можно изменить его размер. Изменить текущий каталог процесса можно с помощью функции SetCurrentDirectory.

SetCurrentDirectory (LPCTSTR IpszPathName):

Параметр IpszPathName – адрес ASCIIZ-строки с путем, последний элемент которого – новый текущий каталог данного процесса.

Платформа Win32 также поддерживает понятие системного и основного каталога Windows. Для определения системного каталога существует специальная функция GetSystemDirectory.

GetSystemDirectory(LPTSTR ipszBuffer, UINT uSize):

Два параметра этой функции определяют адрес и размер буфера, в который записывается путь к системному каталогу Windows.

Для определения основного каталога Windows существует специальная функция GetWindowsDirectory.

UINT GetWindowsDirectorydPTSTR IpBuffer. UINT uSize);

Два параметра этой функции определяют адрес и размер буфера, в который записывается путь к основному каталогу Windows. Возвращаемое значение количество реально записанных в буфер байтов. Его можно использовать для корректировки параметра uSize, если он был задан слишком маленьким, и повторного вызова функции GetWindowsDirectory.

Для демонстрации применения вышеприведенных функций рассмотрим комплексный пример, в ходе которого продемонстрируем порядок вызова и анализа Е возвращаемых значений функциями API Win32 для работы с каталогами. Определим текущий каталог процесса, создадим новый каталог, сделаем его текущим удалим новый каталог, определим системный каталог и каталог Windows.

:prg07_35.asm – Win32 приложение для исследования работы функций
;работы с каталогами API Win32.
.data
TitleText db 'Работа с каталогами в Win32',0
NewOir db "Новый каталог".0
dirjbuf db 50 dup ("?")
size_dir_buf=$-dir_buf
Parent db "..".0
.code
:определив текущий каталог
push offset dirjwf
push size_dir_buf
call GetCurrentDirectoryA
cmp eax.0
jz exit;выход в случае неудачи:создадим каталог
push 0
push offset NewDir.
call CreateDirectoryA
cmp eax,0
jz exit:выход в случае неудачи сделаем новый каталог текущий
push offset NewDir
call SetCurrentDirectoryA
cmp eax.0
jz exit;выход в случае неудачи
;проверим новый текущий каталог
push offset dir_buf
push size_dir_buf
call GetCurrentDirectoryA
cmp eax.0
jz exit.-выход в случае неудачи
;------…..SetCurrentDi rectory-………………-………
:вернемся в родительский каталог
push offset Parent
call SetCurrentDirectoryA
cmp eax.0
jz exit;выход в случае неудачи
;проверил новый текущий каталог
push offset dir_buf
push size_dir_buf
call GetCurrentDirectoryA
cmp eax.O
jz exit:выход в случае неудачи:удалим новый текущий каталог
push offset NewDir
call RemoveDirectoryA
cmp eax.O
jz exit;выход в случае неудачи определив системный каталог mov eax.size_dir_buf push eax
push offset dir_buf call GetSystemDirectoryA cmp eax.O
jz exit:выход в случае неудачи: определим основной каталог Windows mov eax.size_d1r_buf push eax
push offset dir_buf call GetWindowsDirectoryA cmp eax.O
jz exit – . выход в случае неудачи результат смотрим в отладчике TD32.exe
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.