Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
25 Робота з каталогами (теками) у Windows.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
275 Кб
Скачать
☆

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"

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]