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

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

Среди функций Win32, работающих с текущим каталогом, существует функция GetFilePathName, которая по имени файла формирует его полное имя, состоящее из пути от корневого каталога к текущему. Последний элемент этого имени – имя входного файла.

DWORD GetFulIPathNameCLPCTSTR ipFileName. DWORD nBufferLength, LPTSTR ipBuffer.
LPTSTR *lpFilePart):

На входе функция принимает имя файла в виде ASCIIZ-строки. На выходе – три параметра:

  • IpBuffer – адрес буфера, в который помещается полный путь с именем файла;
  • nBufferLength – длина буфера, на который указывает параметр IpBuffer, в символах;
  • lpFilePart – адрес ячейки размером с двойное слово, в которое помещается указатель на позицию внутри буфера, идентифицированную параметром lpBuffег и соответствующую первому символу имени файла после имен всех каталогов.

Самое интересное в этой функции – механизм ее работы. Суть его в том, что реально функция GetFulIPathName не ищет файл, ка имя которого указывает параметр IpBuffer. Результат своей работы – полный путь – она формирует из двух компонент: полного пути к текущему каталогу данного процесса и имени файла, наличие которого на диске функция GetFullPathName даже не проверяет. Для подобной работы ей даже не нужно обращаться к диску. С аналогичной функцией мы уже имели дело, когда рассматривали функции MS DOS для работы с файлами, имеющими длинные имена.

Поиск файлов

При последовательном изучении материала данного раздела читатель кроме знакомства со средствами по работе с файлами операционных систем фирмы Microsoft поневоле должен был оценить процесс эволюции этих средств. Особенно очевиден этот процесс при поиске файлов.

Платформа Win32 предлагает два способа поиска файлов:

  • с использованием функции SearchPath;
  • с использованием функций FindFirr,tFile, FindNExtFile и структуры WIN32 FIND DATA.

Поиск файлов с помощью функции SearchPath

Функция SearchPath ищет файлы в указанном при ее вызове списке каталогов.

DWORD SearchPathtLPCTSTR lpPath. LPCTSTR ipFileName.
 LPCTSTR lpExtension, DWORD nBufferiength. LPTSTR ipBuffer, LPTSTR *lpFilePart):

Первый параметр lpPath определяет список каталогов, в которых будет осуществляться поиск файла. Параметры lpFileName и lpExtension указывают на ASCIIZ-строки с именем и расширением искомого файла. Наличие пары этих параметров позволяет задавать имя и расширение файла двумя способами:

  • одной ASCIIZ-строкой – на нее указывает параметр lpFileName, при этом параметр ipExtension равен NULL;
  • отдельными ASCHZ-строками – в этом случае параметр ipFileName содержит указатель на ASCIIZ-строку с именем файла, а второй параметр lpExtension – содержит указатель на ASCIIZ-строку с расширением файла; строка с расширением должна начинаться с символа. (точка).

Параметр IpBuffer указывает на буфер, куда записывается ASCHZ-строка с полным путем к искомому файлу. Длина этого буфера определяется параметром nBufferLength. Если эта длина слишком мала, то ее можно подкорректировать значением, возвращаемым функцией в регистре ЕАХ. Это значение является количеством символов, действительно необходимых для записи полного имени найденного файла в буфер. Если в ЕАХ возвращается NULL, то это говорит об ошибке вызова функции.

Последний параметр lpFilePart является указателем на символ в буфере, с которого начинается собственно имя файла.

При вызове функции SearchPath параметр lpPath можно задать равным NULL. В этом случае поиск файла будет осуществляться в следующих каталогах (порядок перечисления соответствует порядку просмотра при поиске):

  • каталог, из которого запущено приложение;
  • текущий каталог;
  • системный каталог;
  • основной каталог Windows;
  • каталоги, перечисленные в переменной окружения PATH.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.