В данном примере вызывается панель с информацией о файле. Файл выбирается с помощью компонента TOpenDialog. Для выбора информации о файле используется функция ShellExecuteEx.
Структура SHELLEXECUTEINFO содержит информацию, используемую функцией ShellExecuteEx. Структура описана в файле shellapi.h.
В примере использованы параметры:
lpFile - задает имя файла, который может быть как документом так и исполнямым файлом.
fMask - SEE_MASK_INVOKEIDLIST указывает на необходимость использования списка идентификаторов из lpIDList, чтобы вызвать приложение. Если lpIDList не задан (нулевой), функция создает список идентификаторов и вызывает приложение.
lpVerb - опция, определяющая действие для ShellExecuteEx с заданным файлом. По умолчанию "Open" - открыть файл. Открыть можно зарегистрированные файлы (для текстового файла запускается блокнот и в нем открывается выбранный файл, для .html файла проводник и т.д.) так и исполняемый - происходит запуск приложения.
Для просмотра информации о файле в панели должно быть задано значение - "properties".
Пример кода:
if(OpenDialog1->Execute()) { SHELLEXECUTEINFO tShelExInf; ZeroMemory(&tShelExInf,sizeof(SHELLEXECUTEINFO)); tShelExInf.cbSize=sizeof(SHELLEXECUTEINFO); tShelExInf.lpVerb="properties"; tShelExInf.lpFile=OpenDialog1->FileName.c_str(); tShelExInf.nShow=SW_SHOW; tShelExInf.fMask=SEE_MASK_INVOKEIDLIST; ShellExecuteEx(&tShelExInf); }
Структура TSearchRec определяет информацию о файле, разыскиваемую функциями FindFirst() или FindNext(). Если файл найден, области TSEARCHREC измененяются в соответствии с информацией о файле.
struct TSearchRec { int Time; int Size; int Attr; AnsiString Name; int ExcludeAttr; int FindHandle; _WIN32_FIND_DATAA FindData; void * FindHandle; char[4097] FindData; char[257] Pattern; };
Атрибуты файла зависят от операционной системы:
Константа Значение Описание Linux Значение FaReadOnly 0x01 Только для чтения Текущий пользователь может только читать FaHidden 0x02 Невидимые файлы Имя файла начинается с "." FaSysFile 0x04 Системные файлы Файл - socket, символическая связь(ссылка), файл устройства, или FIFO. FaVolumeID 0x08 Том (ID файлы) Не используется. FaDirectory 0x010 Файлы Каталога Каталог. FaArchive 0x020 Файл Архивный Не используемый. FaAnyFile 0x03F Любой файл Любой файл.
Time содержит метку времени файла. Она может быть преобразована к значению TDateTime функцией FileDateToDateTime.
Size содержит размер файла в байтах.
Name имя файла, включая расширение.
FindHandle - внутренний дескриптор файла.
FindData (только Windows) содержит дополнительную информацию типа время создания файла, последнего доступа, и длинные и короткие имена файла.
Mode (только Linux) - маска разрешения файла.
Функция FindFirst() ищет первый файл с данным именем и данным набором признаков в указанном каталоге.
extern PACKAGE int __fastcall FindFirst(const AnsiString Path,int Attr,TSearchRec &F);
Результат - заполненная структура TSearchRec (параметр F). Используя поля структуры извлекаются необходимые данные о файле.
FindFirst возвращает 0, если файл был найден, иначе, код ошибки.
Путь включает директорию и маску (т.е. могут быть в имени файла групповые символы) имени файла.
Атрибуты файла такие же как и используемые в структуре TSearchRec.
Например, чтобы искать файлы, имеющие атрибуты "скрытый" и "только для чтения" необходимо задать атрибуты "faReadOnly | faHidden".
FindFirst() распределяет память, которая должна быть освобождена вызовом функцией FindClose().
Функция FindNext возвращает следующее имя файла или каталога, после запроса, выполненного Функцией FindFirst.
extern PACKAGE int __fastcall FindNext(TSearchRec &F);
Функция возвращает ноль, если файл или каталог найден и записывает информацию о нем в структуру TSearchRec, иначе значение возвращения - код ошибки.
Обе функции при получении информации о каталоге возвращают структуре TSearchRec int Size=0; Остальные поля соответствуют информации о файлах.
В разделе "Работа с двоичными файлами с использованием функций WinApi" отмечалось, что функция:
BY_HANDLE_FILE_INFORMATION bhFileInformation; GetFileInformationByHandle ( HANDLE(hFile), // дескриптор файла &bhFileInformation //адрес структуры, в которой сохраняется информация о файле );
Структура BY_HANDLE_FILE_INFORMATION определена следующим образом:
typedef struct _BY_HANDLE_FILE_INFORMATION { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD dwVolumeSerialNumber; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD nNumberOfLinks; DWORD nFileIndexHigh; DWORD nFileIndexLow; } BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION, *LPBY_HANDLE_FILE_INFORMATION;
Тоесть, структура имеет все необходимые данные для работы с файлами.