- •Работа с файловой системой dos
- •Получение справочной информации
- •Void far *drv_addr;
- •24.11Стандартные библиотеки трансляторов Microsoft qc 2.5 и Borland содержат несколько функций, облегчающих получение справочной информации о состоянии дисковой подсистемы.
- •Void _dos_getdrive(unsigned *drive);
- •Void _dos_setdrive(unsigned drive, unsigned *drivecount);
- •Void main(void);
- •Void main(void) {
- •Создание, удаление и переименование каталогов
- •Void main(void);
- •Void main(void) {
- •Void main(void);
- •Void main(void) {
- •If(!mkdir(test_dir)) {
- •Int rename(char *oldname, char *newname);
- •Поиск в каталогах
- •Int _dos_findfirst(char *pattern, struct find_t *found, unsigned attr);
- •Int _dos_findnext(struct find_t *found);
- •Void print_info(struct find_t *pfind) {
- •Работа с файлами
- •Int creat(char *filename, int mode);
- •Int open(char *filename,
- •Int oflag [, int pmode]);
- •Int close(int handle);
- •3.5. Чтение/запись файлов
- •Int write(int handle, void *buffer, unsigned count);
- •Int read(int handle, void *buffer, unsigned count);
- •Void main(int, char *[]);
- •Void main(int argc, char *argv[]) {
- •Int source, taget, I;
- •Int eof(int handle);
- •3.6. Позиционирование
- •Void main(void);
- •Void main(void) {
- •Int handle;
- •3.7. Изменение атрибутов, времени и даты файлов
- •Void main(int argc, char *argv[]);
- •Void main(int argc, char *argv[]) {
- •3.8. Буферизация ввода/вывода
- •Int _cnt; // количество оставшихся байтов
- •Int fclose(file *stream);
- •Int fileno(file *stream);
- •Int fseek(file *stream, long offset, int origin);
- •Int fgetpos(file *stream, fpos_t *pos);
- •Int fsetpos(file *stream, fpos_t *pos);
- •Int fputc(int c, file *stream);
- •Int fgetc(file *stream);
- •Int fputs(char *string, file *stream);
- •Int fgets(char *string, int n, file *stream);
- •Int fprintf(file *stream, char *format [,arg]...);
- •Int fscanf(file *stream, char *format [,arg]...);
- •Void setbuf(file *stream, char *buffer);
- •Int setvbuf(file *stream, char *buffer, int mode,
- •Int fflush(file *stream);
- •Void filecpy(file *stream_from, file *stream_to);
- •Void main(int argc, char *argv[]) {
- •Void filecpy(file *stream_from, file *stream_to) {
- •3.9. Другие функции для работы с файлами
- •Int setmode(int handle, int mode);
- •Void rewind(file *stream);
- •Int dup(int handle);
- •Int dup2(int handle1, int handle2);
- •3.10. Таблица открытых файлов
24.11Стандартные библиотеки трансляторов Microsoft qc 2.5 и Borland содержат несколько функций, облегчающих получение справочной информации о состоянии дисковой подсистемы.
Функция _dos_getdiskfree() использует функцию 36h для получения информации о диске. Файл dos.h содержит описание этой функции:
unsigned _dos_getdiskfree(unsigned drive,
struct diskfree_t *diskspace);
Параметр drive задает номер используемого дисковода: 0 - текущий, 1 - А:, и т.д.
Информация возвращается в структуре diskfree_t, которая определена в файле dos.h:
struct diskfree_t
{
unsigned total_clusters;
unsigned avail_clusters;
unsigned sectors_per_cluster;
unsigned bytes_per_sector;
};
В этой структуре:
unsigned total_clusters |
общее количество кластеров на диске; |
unsigned avail_clusters |
количество свободных кластеров; |
unsigned sectors_per_cluster |
количество секторов, занимаемых кластером; |
unsigned bytes_per_sector |
размер сектора в байтах. |
Для получения номера текущего диска и для установки номера текущего диска можно использовать, соответственно, функции _dos_getdrive() и _dos_setdrive().
Функция _dos_getdrive() имеет формат:
Void _dos_getdrive(unsigned *drive);
Эта функция пользуется функцией 19h для получения номера текущего диска, который записывается по адресу, задаваемому параметром. Значение 1 соответствует диску А:, 2 - В:, и т.д.
Функция _dos_setdrive() предназначена для установки текущего диска и может быть использована для определения общего числа дисков в системе:
Void _dos_setdrive(unsigned drive, unsigned *drivecount);
Параметр drive опеределяет текущий диск (1 - А:, и_т.д.), по адресу, задаваемому вторым параметром, функция записывает общее количество логических дисков, установленных в системе. Функция _dos_setdrive() использует функцию 0Eh прерывания INT 21h.
Для иллюстрации способов использования функций _dos_getdrive(), _dos_setdrive(), _dos_getdiskfree() мы составили следующую программу:
#include <dos.h>
#include <bios.h>
#include <conio.h>
#include <stdio.h>
Void main(void);
Void main(void) {
struct diskfree_t dinfo;
unsigned drive, drivecount;
printf(“\n”
“\nОпределение параметров”
“текущего логического диска"
“\n (C)Фролов А., 1991”
“\n”);
// Определяем номер текущего диска:
_dos_getdrive(&drive);
// Выводим на экран литеру текущего диска:
printf("\nТекущийдиск: %c:\n",
'A' + drive - 1);
//Вызываем функцию установки текущего диска.
//Мы не изменяем текущий диск, вызов этой
//функции нужен нам для определения
//количества установленных
//в системе логических дисков
_dos_setdrive(drive, &drivecount);
// Получаем характеристики текущего диска:
_dos_getdiskfree(drive, &dinfo);
printf(“\nОбщее количество”
“кластеров на диске: %d”
“\nКоличество свободных”
“кластеров: %d”
“\nКоличество секторов в”
“кластере: %d”
“\nКоличество байтов в”
“секторе: %d”
“\nРазмер диска”
“в байтах: %ld"
"\n",
dinfo.total_clusters,
dinfo.avail_clusters,
dinfo.sectors_per_cluster,
dinfo.bytes_per_sector,
(long)dinfo.avail_clusters *
dinfo.sectors_per_cluster *
dinfo.bytes_per_sector );
printf(“\nКоличество логических”
“дисков: %d”
“\n”, drivecount);
}