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;
}
