Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2050

.pdf
Скачиваний:
0
Добавлен:
15.11.2022
Размер:
1.12 Mб
Скачать

Синтаксис: BOOL FindNextFile(hFindFile, lpffd)

HANDLE hFindFile; // идентификатор поиска файла LPWIN32_FIND_DATA lpffd; // указатель на атрибуты и свойства найденного файла

Информационные функции файловой системы можно в свою очередь условно разделить на дисковые и файловые.

Дисковые функции позволяют получить следующую информацию:

наличие диска в системе;

тип диска (жесткий, гибкий, сетевой и т.п.);

серийный номер и метка диска. Информация о файловой системе:

название файловой системы, максимальная длина имени файла в символах;

информация об объеме диска:

количество кластеров, количество свободных кластеров, количество секторов в кластере, количество байт в секторе и т.п.

Примеры реализации отдельных функций приведены ниже.

Проверка наличия диска в системе

Проверяется существование заданного диска и изменяется значение свойства Caption компоненты Label1

TLabel *Label1;

bool DriveExist(char *diskLetter) {mdrLetter=CharUpper(diskLetter); return(GetLogicalDrives()&(1<<(diskLetter[0]-__TEXT('A'))));} void main ()

{AnsiString myDisk="C:\\";

if (DriveExist(myDisk.c_str()))Label1->Caption="диск присутствует в данной конфигурации";

else Label1->Caption="диск отсутствует в данной конфигурации";}

11

Распознавание типа диска

Тип диска выводится с помощью компоненты Label.

TLabel *Label1; void main ()

{

char lpDiskName[]="C:\\"; drvtype=GetDriveType(lpDiskName); switch (drvtype)

{

case 0: Label1->Caption="диск не может быть определен";break; case 1: Label1->Caption="корневой директорий

несуществует";break;

case DRIVE_REMOVABLE : Label1->Caption="гибкий диск";break; case DRIVE_FIXED : Label1->Caption="жесткий диск";break; case DRIVE_REMOTE : Label1->Caption="удаленный диск";break; case DRIVE_CDROM : Label1->Caption="компакт диск";break; case DRIVE_RAMDISK : Label1->Caption="виртуальный

диск";break;

}

}

Информация о файловой системе

Компоненты Label1 - Label6 отображают значения флагов системы, Edit1 - метка тома, Edit2 - серийный номер, Edit3 - максимальная длина имени файла, Edit4 - имя файловой системы

(FAT, CDFS,NTFS,HPFS).

TEdit *Edit1;

TEdit *Edit2;

TEdit *Edit3;

TEdit *Edit4; TLabel *Label1; TLabel *Label2; TLabel *Label3; TLabel *Label4; TLabel *Label5; TLabel *Label6;

char lpVolumeNameBuffer[20]; DWORD nVolumeNameSize; DWORD far lpVolumeSerialNumber;

12

DWORD far lpMaximumComponentLength; DWORD far lpFileSystemFlags;

char lpFileSystemNameBuffer[20]; DWORD nFileSystemNameSize; void main ()

{

char chper[25];

char lpDiskName[]="C:\\"; nVolumeNameSize=20; nFileSystemNameSize=20;

if (GetVolumeInformation(lpDiskName,lpVolumeNameBuffer,

nVolumeNameSize,&lpVolumeSerialNumber,&lpMaximumComponentL

ength,

&lpFileSystemFlags,lpFileSystemNameBuffer,nFileSystemNameSize))

{

Edit1->Text=lpVolumeNameBuffer; Edit2-

>Text=(AnsiString)CharUpper(ultoa(lpVolumeSerialNumber,chper,16))

+"h"; Edit3->Text=(int)lpMaximumComponentLength; Edit4->Text=lpFileSystemNameBuffer;

if (lpFileSystemFlags&FS_CASE_IS_PRESERVED)Label1- >Caption="FS_CASE_IS_PRESERVED";

if (lpFileSystemFlags&FS_CASE_SENSITIVE) Label2- >Caption="FS_CASE_SENSITIVE";

if (lpFileSystemFlags&FS_UNICODE_STORED_ON_DISK) Label3->Caption="FS_UNICODE_STORED_ON_DISK"; if (lpFileSystemFlags&FS_PERSISTENT_ACLS) Label4- >Caption="FS_PERSISTENT_ACLS";

if (lpFileSystemFlags&FS_FILE_COMPRESSION) Label5- >Caption="FS_FILE_COMPRESSION";

if (lpFileSystemFlags&FS_VOL_IS_COMPRESSED)Label6- >Caption="FS_VOL_IS_COMPRESSED";

}

}

Информация об объеме диска

Компоненты отображают: Edit1 - общее количество кластеров, Edit2 - количество свободных кластеров, Edit3 -

13

количество занятых кластеров, Edit4 - количество секторов в кластере, Edit5 - количество байт в секторе. Edit6 - Edit8 общее, свободное и занятое дисковое пространство в байтах.

TEdit *Edit1;

TEdit *Edit2;

TEdit *Edit3;

TEdit *Edit4;

TEdit *Edit5;

TEdit *Edit6;

TEdit *Edit7;

TEdit *Edit8;

DWORD far lpSectorsPerCluster; DWORD far lpBytesPerSector; DWORD far lpFreeClusters; DWORD far lpClusters;

void main ()

{

char chper[25];

char lpDiskName[]="C:\\";

DWORD diskspace;// емкость диска в байтах

DWORD freediskspace;// свободная емкость диска в байтах if

(GetDiskFreeSpace(lpDiskName,&lpSectorsPerCluster,&lpBytesPerSect

or,

&lpFreeClusters,&lpClusters))

{

diskspace=lpClusters*lpSectorsPerCluster*lpBytesPerSector;

freediskspace=lpFreeClusters*lpSectorsPerCluster*lpBytesPerSector; Edit1->Text=ultoa(lpClusters,chper,10); Edit2->Text=ultoa(lpFreeClusters,chper,10); Edit3->Text=ultoa(lpClusters-lpFreeClusters,chper,10);// занятые кластеры

Edit4->Text=ultoa(lpSectorsPerCluster,chper,10); Edit5->Text=ultoa(lpBytesPerSector,chper,10); Edit6->Text=ultoa(diskspace,chper,10); Edit7->Text=ultoa(freediskspace,chper,10); Edit8->Text=ultoa(disksize-freediskspace,chper,10);// занятая емкость диска в байтах

14

- }

}

Именно эти функции подразумевают, когда говорят о проверке конфигурации файловой и дисковой системы. Файловые информационные функции - это те функции, которые получают более частную информацию о конкретных файлах и каталогах (директориях). К такой информации можно отнести следующие ее основные виды:

текущая директория;

полный путь к файлу и имя файла;

атрибуты файла;

размер файла;

наличие либо отсутствие искомого файла.

Получение текущей директории

Текущая директория отображается компонентой Edit1.

TEdit *Edit1; DWORD dwCurDir; char lpCurDir[255]; void main () {dwCurDir=255;if

(dwCurDir>=GetCurrentDirectory(dwCurDir,lpCurDir))Edit1- >Text=lpCurDir;}

Получение пути к файлу

Входное имя файла берется из свойства FileName компоненты OpenDialog1. Компонента Edit1 выводит полный путь к файлу вместе с именем, Edit2 - имя файла.

TEdit *Edit1;

TEdit *Edit2;

TOpenDialog *OpenDialog1; DWORD dwPath;

char lpPath[255];//объявление указателя и выделение памяти для пути и имени файла

char *ppszFilePart;//объявление указателя на имя файла (использует память, выделенную выше)

void main () {dwPath=255;

15

if (cchPath>=GetFullPathName(OpenDialog1- >FileName.c_str(),dwPath,lpPath,

&ppFilePart)) {Edit1->Text=lpPath;Edit2->Text=ppFilePart;}}

Получение атрибутов файла

Входное имя файла берется из свойства FileName компоненты OpenDialog1. Компоненты Label1 - Label7 выводят значения атрибутов файла.

TLabel *Label1;

TLabel *Label2;

TLabel *Label3;

TLabel *Label4;

TLabel *Label5;

TLabel *Label6;

TLabel *Label7; TOpenDialog *OpenDialog1; void main ()

{

DWORD f_attrib; f_attrib=GetFileAttributes(OpenDialog1->FileName.c_str()); if (f_attrib!=0xffffffff)

{

if (f_attrib&FILE_ATTRIBUTE_NORMAL) Label1->Caption="без атрибутов";

if (f_attrib&FILE_ATTRIBUTE_SYSTEM) Label2- >Caption="системный"; if (f_attrib&FILE_ATTRIBUTE_ARCHIVE) Label3- >Caption="архивный";

if (f_attrib&FILE_ATTRIBUTE_HIDDEN) Label4- >Caption="скрытый";

if (f_attrib&FILE_ATTRIBUTE_READONLY) Label5- >Caption="только для чтения";

if (f_attrib&FILE_ATTRIBUTE_TEMPORARY) Label6- >Caption="временный";

if (f_attrib&FILE_ATTRIBUTE_DIRECTORY) Label7- >Caption="директория";

}

}

16

Получение размера файла

Входное имя файла берется из свойства FileName компоненты OpenDialog1. Компонента Edit1 выводит размер файла.

TEdit *Edit1;

TOpenDialog *OpenDialog1; HANDLE hFile;

void main ()

{

DWORD f_size; char fsize[25];

hFile=CreateFile(OpenDialog1- >FileName.c_str(),NULL,NULL,NULL,OPEN_EXISTING,NULL,NULL)

;

f_size=GetFileSize(hFile,NULL);if (f_size!=0xffffffff) Edit1- >Text=ultoa(f_size,fsize,10);

CloseHandle(hFile);

}

Поиск файла по маске

Входное имя файла берется из свойства Text компоненты Edit1. Компонента ListBox1 выводит имена найденных файлов в полном формате, а ListBox2 - в формате 8.3.

TEdit *Edit1; TListBox *ListBox1; TListBox *ListBox2;

WIN32_FIND_DATA lpffd; HANDLE hFile_find;

{

hFile_find=FindFirstFile(Edit1->Text.c_str(),&lpffd); if (hFile_find!=INVALID_HANDLE_VALUE) {ListBox1->Items->Append(lpffd.cFileName); ListBox2->Items->Append(lpffd.cAlternateFileName);} while (FindNextFile(hFile_find,&lpffd)) {ListBox1->Items->Append(lpffd.cFileName); ListBox2->Items->Append(lpffd.cAlternateFileName);} FindClose(hFile_find);

}

17

1.3. Управляющие функции файловой системы

Управляющие функции, в отличие от информационных, имеют более широкое применение на практике, так как влекут за собой определенные изменения, направленные на достижение цели. Среди управляющих функций есть как прямо противоположные по назначению информационным (начинающиеся на "Set"), так и дополнительные. Эти функции в файловой системе устанавливают необходимые атрибуты файлам и дискам, создают, переименовывают и удаляют файлы и каталоги и т.д. Список достаточных для большинства решаемых задач и широко используемых управляющих функций выглядит следующим образом:

CreatDirectory;

RemoveDirectory;

SetCurentDirectory;

SetFileAttributes;

CreateFile;

ReadFile;

WriteFile;

CopyFile;

MoveFile;

DeleteFile.

CreateDirectory создает директорию с заданным именем. Функция возвращает true при правильном ее выполнении.

Синтаксис: BOOL CreateDirectory(lpPath, lpsa)

LPCTSTR lpPath; // указатель на имя директории

LPSECURITY_ATTRIBUTES lpsa; // указатель на атрибуты безопасности

RemoveDirectory удаляет директорию с заданным именем, не содержащую файлов.

18

Синтаксис: BOOL RemoveDirectory(lpDir)

LPCTSTR lpDir; // указатель на имя директории

SetCurrentDirectory устанавливает текущую директорию.

Синтаксис:BOOL SetCurrentDirectory(lpCurDir) LPCTSTR lpCurDir; // указатель на новую директорию

SetFileAttributes устанавливает атрибуты заданного файла. Файлу могут быть присвоены следующие атрибуты:

FILE_ATTRIBUTE_ARCHIVE - архивный файл FILE_ATTRIBUTE_DIRECTORY - директория FILE_ATTRIBUTE_HIDDEN - скрытый файл FILE_ATTRIBUTE_NORMAL - файл без атрибутов (не

используется совместно с другими)

ILE_ATTRIBUTE_READONLY - файл только для чтения FILE_ATTRIBUTE_SYSTEM - системный файл FILE_ATTRIBUTE_TEMPORARY - временный файл

Синтаксис: BOOL SetFileAttributes(lpFileName, dwFileAttributes)

LPCTSTR lpFileName; // указатель на имя файла

DWORD dwFileAttributes; // 32-битовое значение атрибутов файла

CreateFile является многоцелевой функцией. Открывает файл либо устройство для обмена данными.

Синтаксис: HANDLE CreateFile(lpName, fdwAccess, fdwShareMode, lpsa, fdwCreate, fdwAttrsAndFlags, hTemplateFile)

LPCTSTR lpName; // указатель на имя файла или устройства DWORD fdwAccess; // способ доступа

DWORD fdwShareMode; // режим совместного доступа

LPSECURITY_ATTRIBUTES lpsa; // указатель на атрибуты защиты

DWORD fdwCreate; // способ открытия файла

19

DWORD fdwAttrsAndFlags; // атрибуты файла

HANDLE hTemplateFile; // идентификатор шаблона файла

Параметр lpName указывает на имя файла (полное или сокращенное) либо на имя устройства:

последовательный порт - "COM1", "COM2" и т.д.; параллельный порт - "LPT1", "LPT2" и т.д.;

порт текущего принтера - "PRN";

клиент именованного канала "\\servername\pipe\pipename".

Битовая маска fdwAccess может принимать следующие значения:

0 - чтение или запись производиться не будут (для изменения параметров файла);

GENERIC_READ - устройство доступно для чтения; GENERIC_WRITE - устройство доступно для записи. Битовая маска dwShareMode может принимать

следующие значения:

0 - монопольный доступ к устройству;

FILE_SHARE_READ - устройство может открываться для чтения;

FILE_SHARE_WRITE - устройство может открываться для записи.

Параметр fdwCreate может принимать следующие значения:

CREATE_NEW - создание нового файла, если нет еще файла с данным именем;

CREATE_ALWAYS - создание нового файла в любом случае;

OPEN_EXISTING - открыть файл, если он существует; OPEN_ALWAYS - открыть файл в любом случае;

TRUNCATE_EXISTING - открыть существующий файл и установить для него нулевую длину.

Битовая маска fdwAttrsAndFlags может принимать следующие значения:

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]