Главная » C++, C++ Builder » Определение состояния файла в CBuilder

0

Как я уже отмечал, функции API FindFirstFile и FindNextFile возвращают указатель  на заполненную структуру типа WIN32_FIND_DATA. Эта структура — целый кладезь информации о файле. Не только основное, но также и альтернативное имя файла находится здесь. Кроме того, здесь есть и размер файла (по непонятным причинам записанный в двух  двойных  машинных словах, переставленных относительно друг друга: сначала старшее слово, затем младшее), и атрибуты файла, которые мы, собственно, и искали.

Размер файла хранится в двух раздельных частях типа DWORD (двойное слово, 4 байта). Умножив старшее (двойное) слово размера на константу MAXDWORD, мы  получим  размер файла, округленный (с недостатком) до двойного слова. Прибавив младшее слово, мы получим полный размер файла в байтах.

После размера файла мы займемся его атрибутами. Атрибуты файла — побитовое множество, указывающее на состояние файла. Атрибуты указывают, можно ли производить запись в файл, изменился ли файл после последнего резервного копирования (бит archive), является ли файл временным файлом в системе (и будет удален во время перезагрузки) и много других вещей. В табл. 9.1 приведены возможные значения битов — атрибутов файла, а также объясняется, что они означают.

Атрибуты файла проверяются на каждый из битов. Хотя есть комбинации атрибутов, которые реально не применяются (например, временный и системный файл), вы можете присвоить такие

атрибуты любому файлу в системе, если захотите. Для изменения атрибутов файлов можно использовать программу attr.exe (из командной строки), а для некоторых атрибутов — также Windows Explorer.

Таблица 9.1. Атрибуты файлов в Windows FILE_ATTRIBUTE_ARCHIVE Указывает, что данный файл изменился. Обычно программа

резервного копирования сбрасывает этот бит

FILE_ATTRIBUTE_COMPRESSED Указывает, что файл хранится в сжатом виде и требует распаковки для использования

FILE_ATTRIBUTE_DIRECTORY Указывает, что файл на самом деле является каталогом

и может содержать в себе файлы

FILE_ATTRIBUTE_HIDDEN Указывает, что файл скрытый. По умолчанию такие файлы не показываются в Windows Explorer

FILE_ATTRIBUTE_READONLY Указывает, что файл предназначен только для чтения.

В такие файлы нельзя ничего записать. Кроме того, их нельзя напрямую удалить FILE_ATTRIBUTE_SYSTEM Указывает, что это системный файл. Хотя это всего лишь предупреждение, изменение системных файлов может привести к страшным последствиям FILE_ATTRIBUTE_TEMPORARY Указывает, что файл — временный. То есть он будет  удален при следующей загрузке операционной системы

После того как мы получили атрибуты файла и поместили результаты в текстовую строку, информация о файле передается в соответствующий ряд в сетке строк.  Следующий файл получается вызовом функции API FindNextFile и процесс повторяется. Цикл прекратится, когда метод FindNextFile вернет false. Заметьте, что в этом случае мы делаем проверку, вызывая функцию API GetLastError, чтобы понять, действительно ли это все. Если мы обработали последний файл, то функция API GetLastError вернет ERROR_NO_MORE_FILES (больше нет файлов). Любая другая ошибка означает, что файл просто не может быть обработан (например, он уже открыт каким-либо приложением и модифицируется).

На рис. 9.5 показано работающее приложение с отображенной группой файлов. Здесь вы можете видеть метку компакт-диска, а также отдельные файлы на компакт-диске, каждый  с отображенными атрибутами, именем и размером.

В данном примере мы рассмотрели довольно много функций API системы Windows SDK (Software Development Kit, пакет для разработки программного обеспечения). Хорошей новостью является то, что в CBuilder проще работать с API, чем в Delphi или Visual Basic, так как типы данных, которые вы передаете функциям API, в основном совпадают с типами данных, которые C++ понимает непосредственно. Вы рады, что это так просто? Вам бы, конечно, хотелось, чтобы все вещи были настолько же просты?

Рис. 9.5. Приложение FileAttributeViewer в работе

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии