
- •Работа с файловой системой 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. Таблица открытых файлов
Int _dos_findfirst(char *pattern, struct find_t *found, unsigned attr);
Int _dos_findnext(struct find_t *found);
В этих функциях параметр pattern определяет образец для поиска файлов, параметр attr - атрибуты файла - используется в качестве дополнительного критерия поиска. Параметр found представляет собой указатель на структуру, в которую будет записываться информация о найденных файлах. Эта структура определена в файле dos.h:
struct find_t {
char reserved[21];
// Зарезервировано для DOS
char attrib; // Атрибуты файла
unsigned wr_time;// Время изменения файла
unsigned wr_date; // Дата изменения файла
long size; // Размер файла в байтах
char name[13]; // Имя файла и расширение
};
Приведем текст программы просмотра содержимого каталога. Программа принимает из командной строки параметр - образец для показа файлов. Если вы укажете параметр *.*, будет выведена информация обо всех файлах. Можно задавать полный путь: c:\*.*.
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
void main(int argc, char *argv[]) ;
void print_info(struct find_t *find);
char *time_conv(unsigned time, char *char_buf);
char *date_conv(unsigned date, char *char_buf);
void main(int argc, char *argv[]) {
struct find_t find;
// Находим первый файл, удовлетворяющий
// критериям поиска.
// В качестве критерия используем образец,
// полученный из командной строки.
// Для поиска используем файлы с любыми
// атрибутами.
if(!_dos_findfirst(argv[1], 0xffff, &find)) {
printf("\n"
"\nИмя файла Аттр. Дата Время Размер"
"\n------------ ----- ------ ------ ------");
// Выводим информацию о первом найденном
// файле на экран
print_info(&find);
}
else {
printf(“Задайте образец”
“ для поиска файлов !”);
exit(-1);
}
// Выводим информацию об остальных найденных
// файлах
while(!_dos_findnext(&find))
print_info( &find );
exit(0);
}
// Функция для вывода информации о найденных
//файлах:
Void print_info(struct find_t *pfind) {
char timebuf[10], datebuf[12];
// Преобразуем формат даты и времени
// последнего изменения файла:
date_conv(pfind->wr_date, datebuf);
time_conv(pfind->wr_time, timebuf);
// Выводим содержимое дескриптора файла:
printf("\n%-12s",pfind->name);
printf(" %02X %8s %8s %8ld ",
pfind->attrib,
datebuf,
timebuf,
pfind->size);
}
// Функция преобразования формата времени:
char *time_conv(unsigned t, char *buf) {
int h, m;
h = (t >> 11) & 0x1f, m = (t >> 5) & 0x3f;
sprintf(buf, "%2.2d:%02.2d:%02.2d",
h % 12, m, (t & 0x1f) * 2);
return buf;
}
// Функция преобразования формата даты:
char *date_conv(unsigned d, char *buf) {
sprintf(buf, "%2.2d.%02.2d.%04.2d",
d & 0x1f,(d >> 5) & 0x0f, (d >> 9) + 1980);
return buf;
}
При запуске программы с параметром *.com на экран может быть выведена информация:
Имя файла Аттр. Дата Время Размер
------------ ----- ---------- -------- ------
CURDIR.COM 20 24.02.1991 08:40:24 5879
DIRCTL.COM 20 24.02.1991 09:10:30 6273
DISKINFO.COM 20 24.02.1991 04:08:42 6075