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