Int main()
{
DWORD dwNumberOfChar;
wchar_t szDirName[MAX_PATH];
// визначаємо ім'я поточного каталога
dwNumberOfChar = GetCurrentDirectory(MAX_PATH, szDirName);
if (dwNumberOfChar == 0)
{
std::cerr << "Get current directory failed." << std::endl
<< "The last error code: " << GetLastError() << std::endl;
std::cout << "Press any key to finish.";
std::cin.get();
return 0;
}
// виводимо на консоль ім'я поточного каталога
std::cout << "Current directory old_name: " << szDirName << std::endl;
std::cin.get();
// встанавлюємо поточний каталог для видалення із нього файлів
if (!SetCurrentDirectory(L"C:\\demo_dir"))
{
std::cerr << "Set current directory failed." << std::endl
<< "The last error code: " << GetLastError() << std::endl;
std::cout << "Press any key to finish.";
std::cin.get();
return 0;
}
// визначаємо ім'я нового поточного каталога
dwNumberOfChar = GetCurrentDirectory(MAX_PATH, szDirName);
if (dwNumberOfChar == 0)
{
std::cerr << "Get current directory failed." << std::endl
<< "The last error code: " << GetLastError() << std::endl;
std::cout << "Press any key to finish.";
std::cin.get();
return 0;
}
// виводимо на консоль ім'я нового поточного каталога
std::cout << "Current directory new_name: " << szDirName << std::endl;
std::cin.get();
return 0;
}
25.6. Спостереження за змінами у каталозі
В ОС Windows передбачені функції, які дозволяють стежити за змінами, що відбуваються в каталогах. Для цих цілей призначені функції FindFirstChangeNotification() і FindNextChangeNotification(), які відстежують відповідно першу і наступні зміни, які відбуваються в каталозі.
Спочатку розглянемо функцію FindFirstChangeNotification(), яка має наступний прототип:
HANDLE FindFirstChangeNotification(
LPCTSTR lpPathName, // ім'я каталога
BOOL bWatchSubtree, // опція спостереження
DWORD dwNotifyFilter); // умови фільтра
У разі успішного завершення функція FindFirstChangeNotification() повертає дескриптор для спостереження за каталогом. Цей дескриптор може використовуватися у функціях очікування для відстежування змін в каталозі. У разі невдачі вона повертає значення invalid_handle_value.
Параметр lpPathName повинен вказувати на символьний рядок, який містить ім'я каталога.
Параметр bWatchSubtree визначає структуру дерева каталогів, які потрібно спостерігати. Якщо bWatchSubtree = false, то система буде відстежувати тільки зміни в заданому каталозі. Якщо ж значення цього параметра дорівнює true, то система відстежуватиме зміни як в заданому каталозі, так і в підкаталогах, що містяться в ньому.
Параметр dwNotifyFiiter задає події, які відстежуються. Ці події відповідають прапорцям, які можуть бути встановлені в цьому параметрі. Можливо встановити наступні прапорці:
file_notify_change_file_name - зміна імені файла;
file_notify_change_dir_name - зміна імені каталога;
file_notify_change_attributes - зміна атрибутів;
file_notify_change_size - зміна розмірів;
file_notify_change_last_write - зміна часу останнього запису;
file_notify_change_security - зміна атрибутів захисту.
Тепер розглянемо функцію FindNextChangeNotification(), яка призначена для спостереження за подальшими змінами, що відбуваються у каталозі. Ця функція має наступний прототип:
BOOL FindNextChangeNotification(
HANDLE hChangeHandle); // дескриптор для спостереження за змінами
У разі успішного завершення функція FindNextChangeNotification() повертає обертає ненульове значення, а у разі невдачі - false.
У параметрі hChangeHandle повинен бути встановлений дескриптор для спостереження за змінами в каталозі, який був отриманий викликом функції FindNextChangeNotification().
Після завершення спостереження за змінами в каталозі потрібно викликати функцію FindCloseChangeNotification(), яка закриває дескриптор спостереження за змінами в каталозі. Ця функція має наступний прототип:
BOOL FindCloseChangeNotification(
HANDLE hChangeHandle // дескриптор для спостереження за змінами
Функція FindCloseChangeNotification() має єдиний параметр hChangeHandle, який повинен містити дескриптор спостереження за змінами в каталозі. У разі успішного завершення ця функція повертає ненульове значення, а у разі невдачі - false.
У лістингу 25.8 приведена програма, яка спостерігає за змінами у каталозі. Програма відстежує тільки дві події, кожна з яких може бути викликано або зміною імені файла, що зберігається в каталозі або зміною розміру каталога.
// Лістинг 25.8. Приклад відстежування змін у каталозі
#include "stdafx.h"
