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

Робота з каталогами (теками) у Windows

25.1. Створення каталога

Для створення каталога використовується функція CreateDirectory(), яка має наступний прототип:

BOOL CreateDirectory(

LPCTSTR lpPathName, // ім'я каталога

Lpsecutity_attributes IpSecurutyAttributes); // атрибути захисту

У разі успішного завершення функція повертає ненульове значення, інакше - false. У параметрі lpPathName задається покажчик на символьний рядок, який містить ім’я створюваного каталога, а параметр IpSecurutyAttributes задає атрибути безпеки цього каталога.

У лістингу 25.1 приведена програма, яка створює каталог.

// Лістинг 25.1. Приклад створення каталога

#include "stdafx.h"

int main()

{

wchar_t lpszFileName[] = L"C:\\Users\\Shogun\\Documents\\demo_dir\\";

// створюємо каталог

if (!CreateDirectory(lpszFileName, NULL))

{

std::cerr << "Create 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 << "The directory is created." << std::endl;

std::cin.get();

return 0;

}

Після створення каталога можна отримати його дескриптор, використовуючи для цього функцію CreateFile() зі встановленим прапорцем File_flag_backup_semantics.

Для створення підкаталогів можна використовувати функцію CreateDirectoryEx(), яка дозволяє успадковувати атрибути іншого каталога, який в цьому випадку називається шаблонним каталогом. Як шаблонний каталог можна вказати батьківський каталог, в якому створюється поточний каталог. Функція CreateDirectoryEx() має наступний прототип:

BOOL CreateDirectoryEx(

LPCTSTR lpTemplateDirectory, // ім'я шаблонного каталога

LPCTSTR lpNewDirectory, // ім'я нового каталога

Lpsecutity_attributes IpSecurutyAttributes); // атрибути захисту

Ця функція відрізняється від функції CreateDirectory() тільки наявністю параметра lpTemplateDirectory, який містить покажчик на ім’я шаблонного каталога.

Наприклад, програма з лістингу 25.2 створює підкаталог в каталозі створеному програмою з лістингу 25.1.

// Лістинг 25.2. Приклад створення підкаталога

#include "stdafx.h"

Int main()

{

wchar_t lpszDirectoryName[] = L"C:\\Users\\Shogun\\Documents\\demo_dir";

wchar_t lpszSubDirectoryName[] = L"C:\\Users\\Shogun\\Documents\\demo_dir\\demo_subdir";

// створюємо підкаталог

if (!CreateDirectoryEx(lpszDirectoryName, lpszSubDirectoryName, NULL))

{

std::cerr << "Create 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 << "The subdirectory is created." << std::endl;

std::cin.get();

return 0;

}

25.2. Пошук файлів у каталозі

Для пошуку файлів, які знаходяться в каталозі, використовуються функції FindFirstFile() і FindNextFile(). Причому функція FindFirstFile() знаходить перший файл, ім’я якого задовольняє зразку пошуку, а функція FindNextFile() знаходить наступні такі файли. При цьому відзначимо, що у зразках імен файлів для пошуку можуть використовуватися символи-замісники ? і *. Символ ? заміщає один невідомий символ в імені файла, а символ * - будь-яку послідовність символів.

Розглянемо функцію FindFirstFile(), яка призначена для знаходження першого файла в каталозі. Ця функція має наступний прототип:

HANDLE FindFirstFile(

LPCTSTR lpFileName, // зразок імені для пошуку

Lpwin32_find_data lpFindFileData); // адреса даних про файл

У разі успішного завершення функція FindFirstFile() повертає дескриптор для пошуку файлів, який використовується надалі функцією FindNextFile(), інакше - invalid_handle_value.

У параметрі 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; // не використовується

CHAR cFileName[Max_path]; // довге ім'я файла

CHAR cAlternateFileName[14]; // коротке ім'я файла

} Win32_find_data, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;

У разі успішного завершення функція FindNextFile() записує в цю структуру дані про перший знайдений файл. Відзначимо, що в полі dwFileAttributes структури Win32_find_data можуть бути встановлені наступні прапорці:

  • file_attribute_archive - архівний файл;

  • file_attribute_compressed - стиснутий файл;

  • File_attribute_directory - каталог;

  • file_attribute_encrypted - зашифрований файл;

  • file_attribute_hidden - прихований файл;

  • file_attribute_normal - нормальний файл;

  • file_attribute_offline - файл у зовнішній пам'яті;

  • file_attribute_readonly - файл призначений тільки для читання;

  • file_attribute_reparse_point - файл містить точку перетворення;

  • file_attribute_sparse_file - розріджений файл;

  • file_attribute_system - системний файл;

  • file_attribute_temporary - тимчасовий файл.

Тепер розглянемо функцію FindNextFile(), яка призначена для знаходження в каталозі наступних файлів після першого знайденого файла. Порядок перерахування файлів залежить від файлової системи. У файловій системі FAT файли перераховуються в порядку їх створення, а у файлових системах NTFS і CDFS - перераховуються в алфавітному порядку. Ця функція має наступний прототип:

BOOL FindNextFile(

HANDLE hFindFile, // дескриптор для пошуку файлів

Lpwin32_find_data lpFindFileData); // адреса даних про файл

У разі успішного завершення функція FindNextFile() повертає ненульове значення, інакше - false.

У параметрі hFindFile цієї функції повинен бути встановлений дескриптор для пошуку файлів, який був отриманий викликом функції FindFirstFile().

Параметр lpFindFileData повинен містити адресу структури типу Win32_find_data, в яку функція FindNextFile() при успішному завершенні помістить інформацію про наступний знайдений файл.

Особливо відзначимо, що як функція FindFirstFile(), так і функція FindNextFile() повертають в структурі типу Win32_find_data інформацію як про файли, так і про підкаталоги. У лістингу 25.3 приведена програма яка виводить на консоль інформацію про всі файли і підкаталоги заданого каталога. Як видно з результатів, в цей список входять поточний і батьківський каталоги.

Крім того, відзначимо, що після завершення пошуку файлів потрібно викликати функцію FindClose(), яка закриває дескриптор пошуку файлів і має наступний прототип:

BOOL FindClose(

HANDLE hFindFile); // дескриптор пошуку файла

Функція FindClose() має єдиний параметр hFindFile, який повинен містити дескриптор пошуку файла. При успішному завершенні ця функція повертає ненульове значення, інакше - FALSE.

// Лістинг 25.3. Приклад пошуку файлів у каталозі

#include "stdafx.h"

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