Написание, компиляция и прогон программы, осуществляющей перемещение указателя текущей позиции внутри открытого файла

В качестве самостоятельного упражнения рекомендуется написать программу, которая проиллюстрировала бы перемещение указателя текущей позиции в результате операций чтения, записи и позиционирования. Необходимо также продемонстрировать в программе независимое позиционирование для двух описателей одного и того же файла и зависимое позиционирование для дубликата уже существующего описателя.

Директории. Логическая структура файлового архива

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

Написание, компиляция и прогон программы, осуществляющей перемещение указателя текущей позиции внутри открытого файла - student2.ru

Рис. 11.1. Формат каталога

Запись в каталоге о файле содержит имя файла, некоторые атрибуты (длина имени, временная метка) и ссылку на запись в главной файловой таблице, необходимую для нахождения блоков файла.

В итоге, файловая система на диске образует хорошо известную древовидную структуру (рис. 11.2), где нет циклов (если отсутствуют ссылки и точки монтирования) и путь от корня к файлу однозначно определяет файл.

Написание, компиляция и прогон программы, осуществляющей перемещение указателя текущей позиции внутри открытого файла - student2.ru

Рис. 11.2. Иерархическая древовидная структура файловой системы

Поскольку имена файлов, находящихся в разных каталогах, могут совпадать, уникальность имени файла на диске обеспечивается добавлением к собственному имени файла списка вложенных каталогов, содержащих данный файл. Так образуется хорошо известное абсолютное или полное имя (pathname), например, \Games\Heroes\heroes.exe. Таким образом, использование древовидных каталогов минимизирует сложность назначения уникальных имен.

Чтобы иметь возможность работать с собственными именами файлов, используют концепцию рабочей или текущей директории, которая обычно входит в состав атрибутов процесса, работающего с данным файлом. Тогда на файлы в такой директории можно ссылаться только по имени. Кроме того ОС поддерживает обозначения '.' - для текущей директории и '..' - для родительской.

В системе поддерживается большое количество Win32-функций для манипуляции с каталогами, их полный перечень имеется в MSDN. В частности, для создания каталогов можно использовать функцию CreateDirectory. Вновь созданная директория включает записи с именами '.' и '..', однако считается пустой. Для работы с текущим каталогом можно использовать функции GetCurrentDirectory и SetCurrentDirectory. Работа с этими функциями проста и не нуждается в специальных разъяснениях.

Прогон программы, задача которой создать каталог на диске и сделать его текущим

#include <windows.h>

#include <stdio.h>

void main(void) {

int iRet = 0;

char Buf[512];

int bufSize = 512;

iRet = GetCurrentDirectory(bufSize, Buf);

printf("iRet = %d, current directory %s\n", iRet, Buf);

iRet = CreateDirectory("f:\\tmp1", NULL);

if(!iRet) printf("CreateDirectory error\n");

iRet = SetCurrentDirectory("f:\\tmp1");

if(!iRet) printf("SetCurrentDirectory error\n");

iRet = GetCurrentDirectory(bufSize, Buf);

printf("iRet = %d, current directory %s\n", iRet, Buf);

}

Приведенная программа выводит на экран название текущего каталога, создает каталог "tmp1" на диске "F:" , делает его текущим и выводит на экран его название в качестве текущего каталога.

Самостоятельное упражнение

На основании предыдущей программы рекомендуется написать программу, которая создает каталог в родительской директории и копирует в него какой-либо файл с помощью функции CopyFile.

Наши рекомендации