Работа с дисками, каталогами и организация поиска файлов
Определение и изменение текущего каталога
Аналогично принципам организации файловой системы 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