- •24.1. Іменування файлів у Windows
- •24.2. Створення і відкриття файлів
- •24.3. Закриття і видалення файлів
- •24.4. Запис даних у файл
- •24.5. Звільнення буферів файла
- •24.6. Читання даних з файла
- •24.7. Копіювання файла
- •24.8. Переміщення файла
- •24.9. Заміщення файла
- •24.10. Робота з покажчиком позиції файла
- •24.11. Визначення і зміна атрибутів файла
- •24.12. Визначення і зміна розмірів файла
- •24.13. Блокування файла
- •24.14. Отримання інформації про файл
24.11. Визначення і зміна атрибутів файла
Розпізнати атрибути файла можна за допомогою функції GetFileAttributes(), яка має наступний прототип:
DWORD GetFileAttributes(
LPCTSTR lpFileName); // ім’я файла
У разі успішного завершення ця функція повертає атрибути файла, інакше - значення -1. Єдиний параметр цієї функції повинен містити ім’я файла, а в повернутому значенні встановлюються атрибути файла. Ці атрибути можна перевірити, використовуючи наступні прапорці:
file_attribute_archive - архівний файл;
file_attribute_compressed - стиснутий файл;
file_attribute_directory - файл є каталогом;
FILE_ATTRIBUTE_ENCRYPTED - шифрований файл;
FILE_ATTRIBUTE_HIDDEN - прихований файл;
file_attribute_normal - нормальний файл;
file_attribute_not_content_indexed - файл не індексується;
file_attribute_offline - файл у зовнішній пам’яті;
FILE_ATTRIBUTE_READONLY - файл тільки для читання;
file_attribute_reparse_point - файл вимагає інтерпретації;
file_attribute_sparse_file - розріджений файл;
file_attribute_system - системний файл;
FILE_ATTRIBUTE_TEMPORARY - тимчасовий файл.
Детальніше атрибути файла описані в розд. 24.2. Про інші атрибути файла, які не увійшли до наведеного вище списку, можна дізнатися, використовуючи функцію GetFileAttributesEx().
Змінити атрибути файла можна за допомогою функції SetFileAttributes(), яка має наступний прототип:
BOOL SetFileAttributes(
LPCTSTR lpFileName, // ім’я файла
DWORD dwFileAttributes); // атрибути файла
У разі успішного завершення ця функція повертає ненульове значення, інакше - false. Параметр lpFileName повинен містити ім’я файла, а в параметрі dwFileAttributes можна встановити наступні атрибути файла:
file_attribute_archive - архівний файл;
file_attribute_hidden - прихований файл;
FILE_ATTRIBUTE_NORMAL – нормальний файл;
file_attribute_not_content_indexed - файл не індексується;
file_attribute_offline - файл у зовнішній пам’яті;
FILE_ATTRIBUTE_READONLY - файл тільки для читання;
file_attribute_system - системний файл;
file_attribute_temporary - тимчасовий файл.
При цьому відмітимо, що якщо встановлюється прапорець file_attribute_normal, то він має бути один, бо всі інші атрибути, анулюють цей атрибут. У лістингу 24.10 приведена програма, яка читає і змінює атрибути файла.
// Лістинг 24.10. Читання і зміна атрибутів файла
#include "stdafx.h"
int main()
{
DWORD file_attr;
wchar_t lpszFileName[] = L"C:\\Users\\Shogun\\Documents\\demo_file.dat";
// читаємо атрибути файла
file_attr = GetFileAttributes(lpszFileName);
if(file_attr == -1)
{
std::cerr << "Get file attributes failed." << std::endl
<< "The last error code: " << GetLastError() << std::endl;
std::cout << "Press any key to finish.";
std::cin.get();
return 0;
}
// перевіряємо, чи є файл нормальним
if(file_attr == FILE_ATTRIBUTE_NORMAL)
{
std::cout << "This is a normal file." << std::endl;
std::cin.get();
}
else
{
std::cout << "This is a not normal file." << std::endl;
std::cin.get();
}
// встановлюємо атрибут прихованого файла
if(!SetFileAttributes(lpszFileName, FILE_ATTRIBUTE_HIDDEN))
{
std::cerr << "Set file attributes failed." << std::endl
<< "The last error code: " << GetLastError() << std::endl;
std::cout << "Press any key to finish.";
std::cin.get();
return 0;
}
// Тепер можна перевірити, що файл став прихований
std::cout << "Now the file is hidden." << std::endl
<< "Press any key to continue.";
std::cin.get();
// Робимо назад файл звичайним
if(!SetFileAttributes(lpszFileName, FILE_ATTRIBUTE_NORMAL))
{
std::cerr << "Set file attributes failed." << std::endl
<< "The last error code: " << GetLastError() << std::endl;
std::cout << "Press any key to finish.";
std::cin.get();
return 0;
}
std::cout << "Now the file is again normal." << std::endl;
std::cin.get();
return 0;
}
