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




 

Win32 API содержит все необходимые функции для работы с каталогами и файлами. При этом набор функций, реализованных в Windows полностью перекрывает обычный набор функций библиотеки времени выполнения, так что необходимость в применении функций последней отпадает. Рассматриваемые здесь функции служат следующим целям:

работа с каталогами (создание, удаление, поиск и получение списка файлов);

получение и изменение атрибутов файлов;

работа с файлами (длинными и короткими именами файлов, копирование, перемещение и удаление файлов);

В таком порядке мы и познакомимся с функциями Win32 API.


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

 

Аналогично обычному Windows API в Win32 API используется понятие текущего каталога, в котором должны размещаться файлы, если только в их имени не содержится путь к этим файлам. Иногда возможно задание относительного пути (подробнее см. Работа с файлами, каталогами и томами в Windows API, стр. 1). Вы можете как узнать текущий каталог с помощью функции GetCurrentDirectory, так и сделать текущим какой–либо иной каталог, воспользовавшись функцией SetCurrentDirectory.

DWORD GetCurrentDirectory(cchDir, lpszDir);

BOOL SetCurrentDirectory(lpszDir);

Параметры функций: lpszDir — буфер, содержащий или получающий имя текущего каталога, cchDir — максимальное число символов в имени текущего каталога, которые могут уместиться в отведенном буфере. Не забывайте, что длина имени (это полный путь к текущему каталогу) может быть очень большой, поэтому удобно сначала узнать необходимый размер буфера, выделить его и затем получить имя:

DWORD nSize;

char *pszCurDir;

dwSize = GetCurrentDirectory(0, NULL); // возвращается требуемая длина,

pszCurDir = new char [ dwSize ]; // включая завершающий ‘\0’

GetCurrentDirectory(dwSize, pszCurDir);

При необходимости вы можете создавать или уничтожать каталоги с помощью функций CreateDirectory и RemoveDirectory. Как и в случае функций библиотеки времени выполнения, функция RemoveDirectory может удалить только пустой каталог; в противном случае функция сообщит об ошибке.

BOOL CreateDirectory(lpszDir, lpsaSA);

BOOL RemoveDirectory(lpszDir);

Параметр lpSA является указателем на структуру SECURITY_ATTRIBUTES, с помощью которого вы можете управлять доступом к файлам.

DWORD GetTempPath(cchBuffer, lpszTempPath);

Эта функция дополняет прежние GetTempDrive и GetTempFileName. Она возвращает путь к каталогу, предназначенному для хранения временных файлов.

Несколько других функций предназначены для поиска файла или для получения списка файлов в каталоге. Функция SearchPath ищет определенный файл и возвращает полный путь к файлу, если только этот файл найден.

DWORD SearchPath(lpszPath, lpszFile, lpszExt, cchBuffer, lpszBuffer, plpszFileNamePart);

Параметр lpszPath указывает на каталог, в котором надо искать файл. Если этот параметр равен NULL, то Windows будет искать файл в том каталоге, откуда приложение запущено, в текущем каталоге, в системных каталогах Windows, и в самом каталоге Windows, а также во всех каталогах, перечисленных на пути поиска, заданном параметром окружения PATH. Параметр lpszFile задает имя файла для поиска, lpszExt — расширение имени искомого файла (используется, если указанное имя не содержит расширения). Параметры cchBuffer, lpszBuffer задают характеристики (размер и адрес) буфера, принимающего имя файла, а указатель на указатель plpszFileNamePart определит позицию, начиная с которой в буфере находится имя файла (то есть первый символ после последнего ‘\’ в пути).

Три функции FindFirstFile, FindNextFile и FindClose примерно соответствуют функциям _dos_findfirst, _dos_findnext и _dos_findclose библиотеки времени выполнения. Функция FindFirstFile требует задания шаблона имен файлов и указателя на специальную структуру WIN32_FIND_DATA, которая будет заполняться информацией о текущем файле, соответствующем шаблону. Функция создает специальный объект, используемый в последующих вызовах функции FindNextFile для продолжения перебора файлов в каталоге. После завершения перебора созданный объект необходимо удалить с помощью функции FindClose.

HANDLE FindFirstFile(lpszFileName, lpFindFileData);

BOOL FindNextFile(hFindFile, lpFindFileData);

BOOL FindClose(hFindFile);

struct WIN32_FIND_DATA {

DWORD dwFileAttributes;

FILETIME ftCreationTime;

FILETIME ftLastAccessTime;

FILETIME ftLastWriteTime;

DWORD dwSizeHigh;

DWORD dwSizeLow;

DWORD dwReserved0;

DWORD dwReserved1;

TCHAR cFileName[ MAX_PATH ];

TCHAR cAlternateFileName[ 14 ];};

Пример:

WIN32_FIND_DATA fd;

HANDLE hFD;

hFD = FindFirstFile(“c:\\*.*”, &fd);

if (hFD) {

do {

// анализ структуры fd и выполнение необходимых действий над файлами.

} while (FindNextFile(hFD, &fd));

FindClose(hFD);}

Последние рассматриваемые нами функции позволяют получать информацию об изменении каталога файлов. Система создает специальный объект, который функция FindFirstChangeNotification первоначально устанавливает в занятое состояние, и который автоматически переводится в свободное состояние, как только в каталоге (или в подкаталогах) происходит указанное изменение. Ожидаемое изменение задается параметром fdwFilter при вызове функции FindFirstChangeNotification.

HANDLE FindFirstChangeNotification(lpszPath, fWatchSubTree, fdwFilter);

HANDLE FindNextChangeNotification(hChange);

BOOL FindCloseChangeNotifictaion(hChange);[v]

Функции FindFirstChangeNotification и FindNextChangeNotification возвращают управление сразу после установки созданного объекта в занятое состояние. Вы можете использовать функции WaitForSingleObject или WaitForMultipleObjects для ожидания изменений в каталоге.

Функция FindCloseChangeNotifictaion удаляет созданный объект.

Внимание! Эти функции не реализованы для Windows 3.x с Win32s. Однако, помимо этого ограничения, существует еще несколько особенностей в применении этих функций. Так, при работе в Windows–95 переименование одного файла в каталоге может приводить к двукратному сообщению об изменении содержимого каталога. Еще серьезнее ограничение на использование удаленных каталогов (каталогов других компьютеров, предоставленных в общий доступ) — система вообще не отслеживает изменения в них, даже если эти изменения осуществлены с вашего компьютера. Это справедливо и для Windows–95 и для Windows NT.




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: