Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции-ТРПС.doc
Скачиваний:
13
Добавлен:
15.11.2018
Размер:
810.5 Кб
Скачать

10. Управление файлами

Прежде чем проводить файловые операции, приложению может потребоваться общая информация о магнитном носителе или CD устройстве. Win32 API включает несколько функций такого назначения. Здесь будут указаны лишь основные.

Если требуется узнать тип устройства, нужно обратиться к функции

UINT GetDriveType (LPCTSTR szRoot)

которая принимает наименование раздела. Напомним, что имя раздела изменяется от “A:” до “Z:”.

Функция возвращает одно из следующих значений:

DRIVE_FIXED

Жесткий диск.

DRIVE_REMOTE

Сетевой диск.

DRIVE_CDROM

CD-ROM привод.

DRIVE_REMOVABLE

Извлекаемый диск.

DRIVE_RAMDISK

RAM диск.

DRIVE_UNKNOWN

Носитель неизвестного типа.

DRIVE_NO_ROOT_DIR

Указанный раздел отсутствует.

Следующая функция

BOOL GetVolumeInformation ( LPCTSTR szRoot, LPTSTR szVolName, DWORD nVolName, LPDWORD pSerialNumber, LPDWORD pMaxFileLength, LPDWORD pFileSysFlags, LPTSTR szFileSysName, DWORD nFileSysName)

дает возможность получить некоторую информацию о разделе szRoot:

szVolName

метка тома, может быть пустой строкой;

pSerialNumber

номер, присваиваемый при форматировании раздела;

pMaxFileLength

максимальная длина полного имени файла;

pFileSysFlags

сведения о разделе в виде набора битовых флагов;

szFileSysName

имя файловой системы, например, “FAT32”.

Узнать общее и свободное пространство на диске szRoot можно аналогично приведенному фрагменту:

DWORD SectorsPerCluster = 0, BytesPerSector = 0, NumberOfFreeClusters = 0, TotalNumberOfClusters = 0;

GetDiskFreeSpace(szRoot, &SectorsPerCluster, &BytesPerSector, &NumberOfFreeClusters, &TotalNumberOfClusters);

// общий объем в МБ DWORD lenTotal = TotalNumberOfClusters* SectorsPerCluster* BytesPerSector; lenTotal >>= 20;

// объем свободного пространства в МБ DWORD lenFree = NumberOfFreeClusters* SectorsPerCluster* BytesPerSector; lenFree >>= 20;

Следует заметить, что данная функция дает неверные результаты для дисков, объем которых превышает 2 ГБ, поэтому использование ее расширения GetDiskFreeSpaceEx() предпочтительнее, поскольку она корректно работает и с дисками большого объема.

Для ранних версий Visual C++ (4 и 5) приложению придется осуществить прямое обращение к библиотеке KERNEL32.DLL для вызова этой функции.

10.1. Доступ к файловой системе

Win32 API поддерживает два принципиально разных подхода при обмене информацией с файловой системой:

- потоковый ввод/вывод, пришедший из MS DOS;

- функции ядра Win32.

10.2. Потоковый ввод/вывод

Большинство программ на языке С, разработанных для MS DOS, использовало потоковый ввод/вывод, который базируется на структуре FILE и семействе функций с ней связанных. Напомним общую схему работы с файлом при использовании потокового ввода/вывода.

1. Файл открывается вызовом функции fopen(), которая возвращает указатель на структуру FILE либо в текстовом, либо в двоичном режиме. Если возникли ошибки при открытии файла, то этот указатель будет равен NULL.

2. Допустимы следующие операции с текстовым файлом: fgets() - чтение строки (до “\r\n”); fputs() - запись строки; fprintf() - форматированный вывод. Для бинарного файла допустимы функции fread(), fwrite(), fseek() и ftell().

3. Файл обязательно нужно закрыть функцией fclose().

Эти функции обновлены для 32-х разрядной версии Windows. Это означает, что можно читать и записывать файл большими блоками информации за один прием, используя однократный вызов функций fread() и fwrite(). Таким образом, отпадает необходимость в использовании циклов при работе с файлами большого размера.

Однако имеются три ограничения:

1) потоковые функции работают только для файлов длиной менее 2 Гб;

2) эти функции не поддерживают разделенный доступ к файлу;

3) работа с файлом должна проводиться в одном обработчике Windows сообщения, т.е. указатель FILE на открытый файл не может передаваться как статическая переменная от одного участка кода к другому.