Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиС.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
106.71 Кб
Скачать

Открытие файлов

Для открытия файлов вы можете воспользоваться универсальной функцией OpenFile или более простой (но и более ограниченной) функцией _lopen.

Приложения Windows могут воспользоваться функцией OpenFile , которая предназначена для создания, открытия, повторного открытия и удаления файлов. Приведем прототип этой функции:

HFILE WINAPI OpenFile(

LPCSTR lpszFileName, // путь к файлу

OFSTRUCT FAR* lpOpenStruct, // адресструктуры OFSTRUCT

UINT fuMode); // режим работы и атрибуты

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

Параметр lpszFileName является указателем на текстовую строку в кодировке ANSI, содержащую путь к файлу и закрытую двоичным нулем. В имени файла не допускается указывать символы шаблона, такие как "*" и "?".

Через параметр lpOpenStruct передается адрес структуры OFSTRUCT, которая заполняется информацией при первом открытии файла.

Параметр fuMode используется для определения действий, выполняемых функцией OpenFile, а также атрибуты файла. Приведем список возможных значений для этого параметра.

Константа

Описание

OF_READ

Файл открывается только для чтения

OF_WRITE

Файл открывается только для записи

OF_READWRITE

Файл открывается для чтения и записи

OF_SHARE_COMPAT

Открытие файла в режиме совместимости. В этом режиме несколько приложений могут одновременно открыть файл, причем все эти приложения должны открывать файл в режиме совместимости

OF_SHARE_EXCLUSIVE

Файл открывается в монопольном режиме. Для всех других приложений доступ к этому файлу на чтение и запись запрещен

OF_SHARE_DENY_WRITE

После открытия файла к нему запрещается доступ со стороны других приложений на запись

OF_SHARE_DENY_READ

После открытия файла к нему запрещается доступ со стороны других приложений на чтение

OF_SHARE_DENY_NONE

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

OF_PARSE

Если указан этот флаг, функция OpenFile не выполняет никаких других действий, кроме заполнения структуры OFSTRUCT

OF_DELETE

Уничтожение существующего файла

OF_VERIFY

Если указан этот флаг, функция OpenFile сравнивает время и дату, записанную в структуре OFSTRUCT с временем и датой изменений указанного файла. Если обнаружено несоответствие, функция OpenFile возвращает значение HFILE_ERROR

OF_SEARCH

Операционная система Windows выполняет поиск файла в каталогах даже в том случае, когда текстовая строка, указанная параметром lpszFileName, содержит полный путь к файлу

OF_PROMPT

Если указан этот флаг, то в случае невозможности найти указанный файл Windows выдает диалоговую панель с предложением вставить в дисковод A: дискету с файлом. Этот флаг используется очень редко

OF_CANCEL

Флаг OF_CANCEL используется в сочетании с флагом OF_PROMPT. Если он указан, то в описанную выше диалоговую панель будет добавлена кнопка "Cancel", позволяющая отменить открытие файла. Приложение получит в этом случае код ошибки, соответствующий ненайденному файлу, а пользователь - возможность выйти из безвыходного состояния, в которое он может попасть, не имея под рукой дискеты с нужным файлом

OF_CREATE

Выполняется создание нового файла. Если указанный файл существует, он обрезается до нулевой длины

OF_EXIST

При указании этого флага функция OpenFile вначале открывает файл, а затем сразу же его закрывает. Эта бесполезная на первый взгляд операция может быть использована для того чтобы убедиться в существовании указанного файла на диске

OF_REOPEN

Этот флаг используется при повторном открытии файла на основе информации, хранящейся в структуре OFSTRUCT

Когда функция OpenFile вызывается в первый раз для открытия файла, она заполняет структуру OFSTRUCT , описанную в файле windows.h следующим образом:

typedef struct tagOFSTRUCT

{

BYTE cBytes;

BYTE fFixedDisk;

UINT nErrCode;

BYTE reserved[4];

char szPathName[128];

} OFSTRUCT;

ПолеcBytesсодержитразмерсамойструктурыOFSTRUCTвбайтах.

С помощью поля fFixedDisk приложение может определить, находится ли открытый файл на жестком диске или на флоппи-диске. если содержимое этого поля отлично от нуля, для хранения файла используется жесткий диск.

Если при открытии файла произошла ошибка, в поле nErrCode записывается код ошибки. Возможные значения для кода ошибки приведены в приложении.

Поле reserved зарезервировано и не должно использоваться.

В поле szPathName находится полный путь к файлу в кодировке OEM.

Если функция OpenFile показалась вам слишком сложной в использовании, в ряде случаев для открытия файла вы сможете ограничиться функцией _lopen :

HFILE WINAPI _lopen(LPCSTR lpszFileName, int fnOpenMode);

Функция возвращает идентификатор открытого файла или HFILE_ERROR при ошибке.

Параметр lpszFileName, так же как и для функции OpenFile, является указателем на текстовую строку в кодировке ANSI, содержащую путь к файлу и закрытую двоичным нулем. В имени файла не допускается указывать символы шаблона, такие как "*" и "?".

Параметр fuOpenMode определяет режим, в котором открывается файл. Приведем список возможных значений для этого параметра.

Константа

Описание

READ

Файл открывается только для чтения

WRITE

Файл открывается только для записи

READWRITE

Файл открывается для чтения и записи

OF_SHARE_COMPAT

Открытие файла в режиме совместимости. В этом режиме несколько приложений могут одновременно открыть файл, причем все эти приложения должны открывать файл в режиме совместимости

OF_SHARE_EXCLUSIVE

Файл открывается в монопольном режиме. Для всех других приложений доступ к этому файлу на чтение и запись запрещен

OF_SHARE_DENY_WRITE

После открытия файла к нему запрещается доступ со стороны других приложений на запись

OF_SHARE_DENY_READ

После открытия файла к нему запрещается доступ со стороны других приложений на чтение

OF_SHARE_DENY_NONE

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

Если вам надо открыть файл в каталоге, где находится сама операционная система Windows или в системном каталоге Windows, воспользуйтесь функциями, соответственно, GetWindowsDirectory и GetSystemDirectory.

Функция GetWindowsDirectory позволяет определить расположение каталога, в который была установлена операционная система Windows:

UINT WINAPI GetWindowsDirectory(

LPSTR lpSysPath, // адресбуфера

UINT cbSysPath); // размер буфера

Параметр lpSysPath является указателем на буфер размером не менее 144 байт, в который будет записан путь к искомому каталогу.

С помощью параметра cbSysPath необходимо указать размер буфера в байтах.

Учтите, что операционная система Windows может быть установлена в локальном и сетевом варианте. В локальном варианте пользователь имеет доступ на запись как к тому каталогу, в который установлена операционная система Windows, так и к системному каталогу Windows. В сетевом варианте системный каталог Windows расположен на сервере и обычный пользователь имеет в этом каталоге права на чтение, но не на запись.

Для определения пути к системному каталогу Windows предназначена функция GetSystemDirectory :

UINT WINAPI GetSystemDirectory(

LPSTR lpSysPath, // адресбуфера

UINT cbSysPath); // размер буфера

Назначение параметров этой функции аналогично назначению параметров функции GetWindowsDirectory.

Так как системный каталог Windows может находиться на сервере, приложение не должно пытаться создавать или изменять файлы в этом каталоге. Как правило, пользователь не имеет права записи в системный каталог Windows.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]