- •Дополнительная информация из интернета
- •Открытие файлов
- •Стандартные диалоговые панели для открытия файлов
- •NMaxCustFilter - Определяет размер буфера в байтах, указанного в поле lpstrCustomFilter. Размер этого буфера должен быть не меньше 40 байт.
- •Закрытие файлов
- •Создание файлов
- •Чтение и запись
- •Позиционирование
- •Определение типа устройства ввода/вывода
- •Использование стандартной библиотеки транслятора
Открытие файлов
Для открытия файлов вы можете воспользоваться универсальной функцией 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.
