Открытие файлов
Для открытия файлов вы можете воспользоваться универсальной функцией 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 записывается код ошибки. Возможные значения для кода ошибки приведены в приложении 1.
Поле 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.