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.