- •Работа с файловой системой 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 close(int handle);
В качестве параметра функции передается файловый индекс, полученный при открытии или создании файла. Функция возвращает 0 при успешном закрытии файла, или -1 при ошибке.
Код ошибки для этой и других функций cтандартных библиотек трансляторов Microsoft QC 2.5 и C 6.0 записывается в глобальную переменную errno.
3.5. Чтение/запись файлов
После того, как вы открыли файл, можно выполнять над ним операции чтения/записи. Для записи данных в файл предназначена функция 40h прерывания INT 21h. В качестве параметров для этой функции необходимо задать файловый индекс, полученный при открытии существующего файла или создании нового, адрес буфера, содержащего записываемые данные и количество записываемых байтов:
На входе: |
AH = 40h |
|
BX = файловый индекс открытого файла |
|
CX = количество записываемых байтов |
|
DS:DX = Адрес буфера, содержащего записываемые данные |
На выходе: |
AX = Код ошибки, если был установлен в 1 флаг переноса CF; Количество действительно записанных байтов, если флаг переноса CF сброшен в 0. |
При записи данные попадают в то место внутри файла, которое определяется содержимым так называемого файлового указателя позиции. При создании нового файла этот указатель сбрасывается в 0, что соответствует началу файла. При открытии файла с помощью функции 3Dh указатель также устанавливается на начало файла. Операция записи в файл с помощью функции 40h продвигает указатель вперед к концу файла на количество записываемых байтов.
По мере увеличения размера файла ему будут распределяться все новые и новые кластеры из числа отмеченных как свободные.
Если вам необходимо перезаписать содержимое файла, а не дописывать данные в конец, необходимо воспользоваться функцией позиционирования. Эта функция позволяет управлять содержимым файлового указателя позиции, она будет описана в следующем разделе.
Следует учитывать, что количество действительно записанных байтов может не совпадать с заданным в регистре CX при вызове функции 40h. Такая ситуация возможна, например, при записи в файл, открытый в текстовом режиме, байта Ctrl-Z (1Ah). Этот байт означает конец текстового файла. Другая возможная причина - отсутствие свободного места на диске.
Если функция вызывается с содержимым регистра CX, равным 0, файл будет обрезан или расширен до текущего положения файлового указателя.
Разумеется, что если программа, выполняющая запись в файл, работает в сети, она должна иметь соответствующие права доступа к каталогу и файлу.
Функция 40h может выполнять запись не только в файл, но и в устройство посимвольной обработки, предварительно открытое функцией 3Dh. Об этом мы говорили в разделах книги, посвященных драйверам.
Для чтения данных из файла (или устройства посимвольной обработки) предназначена функция 3Fh прерывания INT 21h:
На входе: |
AH = 3Fh |
|
BX = файловый индекс открытого файла |
|
CX = количество читаемых байтов |
|
DS:DX = Адрес буфера для данных |
На выходе: |
AX = Код ошибки, если был установлен в 1 флаг переноса CF; Количество действительно прочитанных байтов, если флаг переноса CF сброшен в 0. |
Эта функция используется аналогично функции записи. Для нее верны все замечания, касающиеся файлового указателя позиции, количества действительно прочитанных байтов и прав доступа.
Если ваша программа составлена на языке программирования С, для записи и чтения данных она может воспользоваться функциями write() и read():