Получение информации о файлах и каталогах

В начало

Вызов информационной панели файлов

В данном примере вызывается панель с информацией о файле. Файл выбирается с помощью компонента 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);
}

fileinf.jpg

В начало

Структура TSearchRec и функции FindFirst(), FindNext()

Структура 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;

Тоесть, структура имеет все необходимые данные для работы с файлами.

В начало

На главную подраздела

Домой