Программирование для 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. |