Учебное пособие: Файловая система
Для работы с файлами в Windows содержится свой набор функций, позволяющих выполнять основные операции над файлами. В первых 16ти разрядных версиях Windows (по 3.x включительно) эти функции основывались на применении функций MS–DOS. Непосредственно в Windows описан только минимальный набор базовых функций, для выполнения других операций всегда можно воспользоваться прерыванием 0x21. В отличие от них, 32х разрядные версии Windows содержат уже полный набор функций для работы с файлами, при этом использование функций MS–DOS не допускается. Функции Win32 API для работы с файлами — это расширенный набор функций по сравнению с Windows API.
Работа с файлами, каталогами и томами в Windows API
В Windows 3.x применяется файловая система MS–DOS. В первых версиях Windows вообще вся работа с дисками просто переадресовывалась к функциям MS–DOS, в поздних версиях, например Windows for Workgroup 3.11, в частных случаях может использовать собственные средства, реализующие доступ к диску и к файлам в 32х разрядном защищенном режиме. Это несколько увеличивает производительность системы, работающей в защищенном режиме, так как при обращениям к данным на диске исключаются переключения процессора из защищенного режима в реальный и обратно. При этом система проверяет, возможно ли с помощью имеющихся драйверов обращаться к данному диску, или нет. Если это невозможно (например, используются нестандартные DOS–драйверы), то для доступа к диску и файлам применяются средства MS–DOS, как в предыдущих версиях Windows.
Файлы (file) группируются в каталоги (directory или folder, папки). В одном каталоге может находиться большое количество файлов или других вложенных каталогов. Каталоги образуют строго древовидную структуру — данный каталог может содержать сколько угодно вложенных, но сам он может быть вложен только в один родительский каталог (каталог верхнего уровня). На каждом томе (volume) существует один каталог самого верхнего уровня — корневой каталог (root directory). Для обозначения конкретного тома используются буквы английского алфавита, начиная с “a”.
Имена файлов (file name) и каталогов (directory name, folder name) в Windows API, как и в MS–DOS, состоят из имени, длиной до 8 символов и расширения, длиной до 3 символов, отделяемого от имени одной точкой. Таким образом максимальная длина имени составляет 12 символов, включая разделяющую точку. Для точного задания файла необходимо указать не только его имя, но также и каталог, в котором он находится. Причем, так как каталоги могут быть вложенные, то необходимо задавать список каталогов, которые надо пройти на пути от текущего каталога, либо от корневого каталога тома до каталога, содержащего нужный файл.
Имя тома, путь до файла и имя файла составляют так называемое полное имя файла (path name). Полное имя начинается с названия тома, за которым следует двоеточие, обратная косая черта и список каталогов на пути к файлу, разделяемых обратными косыми чертами, затем следует имя файла и его расширение, отделяемое точкой. Например: E:\Mka\Book\Samples\1a.cpp
Указывает на файл 1a.cpp, находящийся к каталоге Samples, вложенном в подкаталог Book и, вместе с ним, в подкаталог Mka, хранящийся на томе E.
Для каждого тома существует понятие текущего каталога (current directory). Кроме того существует понятие текущего тома (диска) (current drive). Для задания файла, находящегося в текущем каталоге текущего тома, достаточно просто указать имя этого файла. Вы можете легко сделать текущий диск другим и перейти в нем в какой–либо иной каталог. В этом случае система запомнит тот каталог, в котором вы были перед переходом на другой диск, и будет считать его текущим каталогом для прежнего диска.
Так, например:
1a.cpp — задает файл 1a.cpp в текущем каталоге текущего диска
E:1a.cpp — задает файл 1a.cpp в текущем каталоге тома E
E:\1a.cpp — задает файл 1a.cpp в корневом каталоге тома E
\1a.cpp — задает файл 1a.cpp в корневом каталоге текущего диска
Система допускает использование специальных имен “.” (точка) и “..” (две точки) для задания текущего каталога и для задания каталога верхнего уровня. Например, пусть текущий каталог E:\Mka\Book\Samples, тогда:
.\1a.doc— задает файл E:\Mka\Book\Samples\1a.cpp
..\Chapter2.doc — задаетфайл E:\Mka\Book\Chapter2.doc
В системе запрещается использовать имена файлов и каталогов, совпадающие с именами стандартных устройств, например CON, COM2, LPT1, PRN и так далее.
Система ограничивает максимальную длину полного имени файла144 символами. Так как заранее известно, что полное имя не превысит этой длины, то часто для работы с именами файлов используются статически выделяемые области, размер которых не изменяется.
Собственно в Windows 3.x содержится небольшой набор функций, повторяющих основные операции над файлами — создание, открытие, позиционирование файлового указателя, чтение, запись и закрытие; помимо этого предусмотрено несколько дополнительных функций. Функций для разделения доступа, переименования или копирования файлов, создания и смены каталогов и прочего не предусматривается. При необходимости можно воспользоваться прерыванием 0x21, либо функциями стандартной C–библиотеки времени выполнения.
HFILE _lcreat(lpszFilename, fnAttribute);
HFILE _lopen(lpszFilename, fnOpenMode);
LONG _llseek(hf, lOffset, nOrigin);
UINT _lread(hf, hpvBuffer, cbBuffer);
UINT _lwrite(hf, hpvBuffer, cbBuffer);
long _hread(hf, hpvBuffer, cbBuffer);
long _hwrite(hf, hpvBuffer, cbBuffer);
HFILE _lclose(hf);
--> ЧИТАТЬ ПОЛНОСТЬЮ <--