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

Int main()

{

HANDLE hFindFile;

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

WIN32_FIND_DATA fd;

// знаходимо перший файл

hFindFile = FindFirstFile(lpszDirectoryName, &fd);

if (hFindFile == INVALID_HANDLE_VALUE)

{

std::cerr << "Find first file 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 first file name: " << fd.cFileName << std::endl;

// знаходимо наступний файл і виводимо на консоль його ім'я

while (FindNextFile(hFindFile, &fd))

std::cout << "The next file name: " << fd.cFileName << std::endl;

// закриваємо дескриптор пошуку

FindClose(hFindFile);

std::cin.get();

return 0;

}

Для більш просунутого пошуку файлів може використовуватися функція FindFirstFileEx(), яка дозволяє враховувати при пошуку файла не тільки його ім’я, але також і його атрибути. Відзначимо, що ця функція підтримується тільки в операційних системах Windows NT/2000/XP.

25.3. Видалення каталога

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

BOOL RemoveDirectory(

LPCTSTR lpPathName ); // ім’я каталога

Єдиний параметр цієї функції повинен вказувати на символьний рядок, який містить ім’я каталога, що видаляється. При успішному завершенні функція RemoveDirectory() повертає ненульове значення, інакше - false.

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

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

#include "stdafx.h"

Int main()

{

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

// видаляємо каталог

if (!RemoveDirectory(lpszDirectoryName))

{

std::cerr << "Remove 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 removed." << std::endl;

std::cin.get();

return 0;

}

На практиці каталог рідко буває порожнім, тому перш ніж видалити сам каталог, потрібно видалити всі підкаталоги, які знаходяться в ньому, і файли. Опишемо, як видаляти з каталога файли. Цей же підхід використовується і для видалення файлів з підкаталогів.

У лістингу 25.5 приведена програма, яка видаляє з каталога файли, а потім видаляє сам каталог.

// Лістинг 25.5. Приклад видалення каталога з файлами

#include "stdafx.h"

Int main()

{

HANDLE hFindFile;

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

wchar_t lpszDirectoryFileName[] = L"C:\\Users\\Shogun\\Documents\\demo_dir\\%s";

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

WIN32_FIND_DATA fd;

wchar_t szFullFileName[MAX_PATH];

// знаходимо перший файл

hFindFile = FindFirstFile(lpszFirstFileName, &fd);

if (hFindFile == INVALID_HANDLE_VALUE)

{

std::cerr << "Find first file 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 first file name: " << fd.cFileName << std::endl;

// видаляємо із каталога файли

while (FindNextFile(hFindFile, &fd))

{

// якщо це не підкаталог, то видаляємо його

if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))

{

// формуємо ім'я файла

swprintf(szFullFileName, lpszDirectoryFileName, fd.cFileName);

// видаляємо файл

if (!DeleteFile(szFullFileName))

{

std::cerr << "Delete file failed." << std::endl

<< "The last error code: " << GetLastError() << std::endl;

std::cout << "Press any key to finish.";

std::cin.get();

return 0;

}

else

std::cout << "The next file: " << fd.cFileName << " is deleted." << std::endl;

}

else

std::cout << "The next directory: " << fd.cFileName << " is not deleted." << std::endl;

}

// закриваємо дескриптор пошуку

if (!FindClose(hFindFile))

{

std::cout << "Find close failed." << std::endl;

return 0;

}

// видаляємо каталог

if (!RemoveDirectory(lpszDirectoryName))

{

std::cerr << "Remove 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 removed." << std::endl;

// закриваємо дескриптор пошуку

FindClose(hFindFile);

std::cin.get();

return 0;

}

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