Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование для Windows NT

© Александр Фролов, Григорий Фролов
Том 26, часть 1, М.: Диалог-МИФИ, 1996, 272 стр.

[Назад] [Содеожание] [Дальше]

Работа с каталогами

Кратко перечислим несколько функций, предусмотренных в программном интерфейсе Microsoft Windows NT для работы с каталогами.

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

С помощью функции GetCurrentDirectory приложение может определить текущий каталог:


DWORD GetCurrentDirectory(
  DWORD  nBufferLength, // размер буфера 
  LPTSTR lpBuffer);     // адрес буфера 

Перед вызовом этой функции вы должны подготовить буфер. Через параметр lpBuffer функции GetCurrentDirectory следует передать адрес буфера, а через параметр nBufferLength - размер буфера в байтах.

В случае успеха функция возвращает размер заполенной части буфера, при ошибке - нулевое значение.

Определение системного каталога

При необходимости с помощью функции GetSystemDirectory вы можете определить путь к системному каталогу Microsoft Windows NT (например, C:\WINNT\SYSTEM32, если Microsoft Windows NT установлена на диск C:):


UINT GetSystemDirectory(
  LPTSTR lpBuffer, // адрес буфера 
  UINT   uSize);   // размер буфера в байтах 

Определение каталога Microsoft Windows NT

Функция GetWindowsDirectory позволяет узнать путь к каталогу, в который установлена операционная система Windows (например, C:\WINNT):


UINT GetWindowsDirectory(
  LPTSTR lpBuffer, // адрес буфера 
  UINT   uSize);   // размер буфера в байтах 

Изменение текущего каталога

Для изменения текущего каталога используйте функцию SetCurrentDtirecory:


BOOL SetCurrentDirectory(LPCTSTR lpszCurDir);

Через параметр lpszCurDir вы должны передать функции SetCurrentDtirecory путь к новому каталогу.

Создание каталога

Вы можете создать новый каталог при помощи функции CreateDirectory XE "CreateDirectory" :


BOOL CreateDirectory(
  LPCTSTR lpPathName,  // путь к создаваемому каталогу
  LPSECURITY_ATTRIBUTES lpSecurityAttributes); // дескриптор 
                                               // защиты 

Если вам не нужно определять специальные права доступа к создаваемому каталогу (например, запретить некоторым пользователям удалять каталог), вы можете указать для параметра lpSecurityAttributes значение NULL.

Удаление каталога

Для удаления каталога следует использовать функцию RemoveDirectory:


BOOL RemoveDirectory(LPCTSTR lpszDir);

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

Изменение имени каталога

В программном интерфейсе Microsoft Windows NT нет специальной функции, предназначенной для изменения имени каталогов, однако вы можете выполнить эту операцию при помощи функций MoveFile XE "MoveFile" или MoveFileEx XE "MovefileEx" , предназначенных для перемещения файлов. Разумеется, при этом новый и старый каталоги должны располагаться на одном и том же диске.

Просмотр содержимого каталога

Для просмотра содержимого каталогов в программном интерфейсе Microsoft Windows NT предусмотрены функции FindFirstFile XE "FindFirstFile" , FindNextFile XE "FindNextFile" и FindClose XE "FindClose" . Просмотр с помощью этих функций выполняется в цикле.

Перед началом цикла вызовается функция FindFirstFile:


HANDLE FindFirstFile(
  LPCTSTR lpFileName,                // адрес пути для поиска 
  LPWIN32_FIND_DATA lpFindFileData); // адрес структуры 
                     // LPWIN32_FIND_DATA, куда будет записана 
                     // информация о файлах

Через параметр lpFileName вы должны передать функции адрес строки, содержащей путь к каталогу и шаблон для поиска. В шаблоне можно использовать символы “?” и “*”.

Через параметр lpFindFileData следует передать адрес структуры типа WIN32_FIND_DATA, в которую будет записана информация о найденных файлах. Эта структура определена следующим образом:


typedef struct _WIN32_FIND_DATA 
{
  DWORD    dwFileAttributes;       // атрибуты файла
  FILETIME ftCreationTime;         // время создания файла
  FILETIME ftLastAccessTime;       // время доступа
  FILETIME ftLastWriteTime;        // время записи
  DWORD    nFileSizeHigh;     // размер файла (старшее слово)
  DWORD    nFileSizeLow;      // размер файла (младшее слово)
  DWORD    dwReserved0;            // зарезервировано
  DWORD    dwReserved1;            // зарезервировано
  TCHAR    cFileName[MAX_PATH];    // имя файла
  TCHAR    cAlternateFileName[14]; // альтернативное имя файла
} WIN32_FIND_DATA;

Если поиск завершился успешно, функция FindFirstFile возвращает идентификатор поиска, который будет затем использован в цикле при вызове функции FindNextFile. При ошибке возвращается значение INVALID_HANDLE_VALUE XE "INVALID_HANDLE_VALUE" .

Заметим, что поля cFileName и cAlternateFileName структуры WIN32_FIND_DATA содержат, соответственно, длинное имя файла и короткое, альтернативное имя файла “в формате 8.3”.

После вызова функции FindFirstFile вы должны выполнять в цикле вызов функции FindNextFile:


BOOL FindNextFile(
  HANDLE hFindFile,                  // идентификатор поиска 
  LPWIN32_FIND_DATA lpFindFileData); // адрес структуры 
                                     // WIN32_FIND_DATA 

Через параметр hFindFile этой функции следует передать идентификатор поиска, полученный от функции FindFirstFile. Что же касается параметра lpFindFileData, то через него вы должны передать адрес той же самой структуры типа WIN32_FIND_DATA, что была использована при вызове функции FindFirstFile.

Если функция FindNextFile завершилась успешно, она возвращает значение TRUE. При ошибке возвращается значение FALSE. Код ошибки вы можете получить от функции GetLastError XE "GetLastError" . В том случае, когда были просмотрены все файлы в каталоге, эта функция возвращает значение ERROR_NO_MORE_FILES XE "ERROR_NO_MORE_FILES" . Вы должны использовать такую ситуацию для завершения цикла просмотра содержимого каталога.

После завершения цикла просмотра необходимо закрыть идентификатор поиска, вызвав для этого функцию FindClose XE "FindClose" :


BOOL FindClose(HANDLE hFindFile);

В качестве единственного параметра этой функции передается идентификатор поиска, полученный от функции FindFirstFile.

[Назад] [Содеожание] [Дальше]