Меню Рубрики

Создание закрытие и открытие файлов в приложениях windows

Открытие, сохранение и закрытие файлов в приложениях Windows

Созданный и сохраненный описанным выше способом файл документа в дальнейшем может понадобиться для выполнения в приложении каких-либо действий с ним. Для продолжения работы с ранее созданным документом его нужно открыть. Способы открытия документа из операционной системы Windows рассматривались выше, а в приложениях Windows это действие можно выполнить одним из следующих способов:

· выполнить команду Файл > Открыть. окна приложения;

· выполнить щелчок клавишей мыши по значку Открыть панели инструментов окна приложения (если панель и значок находятся в окне);

· использовать сочетание клавиш Ctrl+O (или Ctrl+щ).

Рис. 9.29.Диалоговое окно Открытие файла

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

1) при необходимости развернуть список Тип файлов: и выбрать тип, соответствующий типу открываемого файла;

2) при необходимости развернуть список Папка: и, действуя, как в окне Мой компьютер, выбрать нужное дисковое устройство и открыть родительскую папку, содержащую нужный файл;

3) пользуясь полосой прокрутки, вывести строку с названием отрываемого файла в зону видимости и дважды щелкнуть клавишей мыши на этой строке.

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

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

В большинстве приложений Windows операция текущего сохранения может быть выполнена одним из следующих способов:

§ выполнить команду Файл > Сохранить окна приложения;

§ выполнить щелчок клавишей мыши по значку Сохранить панели инструментов окна приложения (если панель и значок находятся в окне);

§ использовать сочетание клавиш Ctrl+S (или Ctrl+ы).

ВНИМАНИЕ

Эта команда не выводит на экран диалоговое окно, так как сохранение документа осуществляется в той же самой папке и под тем же именем, что и старый вариант документа.

СОВЕТ

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

Если документ, в который вносились изменения, в дальнейшей текущей работе с данным приложением уже не требуется, его следует закрыть. Закрытие файла документа в приложениях Windows выполняется по команде Файл > Закрыть.

Рис. 9.30.Окно предупреждения о несохраненных изменениях в документе

Если перед выполнением операции закрытия пользователь вносил в документ изменения и по каким-либо причинам не выполнил их сохранение, то операционная система выведет на экран окно предупреждения, изображенное на рис. 9.30, и предложит три варианта действий: сохранить изменения с помощью кнопки Да, не сохранять изменения и вернуться к предыдущему состоянию документа нажатием кнопки Нет и отменить выполнение операции закрытия документа с помощью кнопки Отмена.

Дата добавления: 2016-09-20 ; просмотров: 465 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Источник

Открытие, сохранение и закрытие файлов в приложениях Windows

Созданный и сохраненный описанным выше способом файл документа в дальнейшем может понадобиться для выполнения в приложении каких-либо действий с ним. Для продолжения работы с ранее созданным документом его нужно открыть. Способы открытия документа из операционной системы Windows рассматривались выше, а в приложениях Windows это действие можно выполнить одним из следующих способов:

· выполнить команду Файл > Открыть. окна приложения;

· выполнить щелчок клавишей мыши по значку Открыть панели инструментов окна приложения (если панель и значок находятся в окне);

· использовать сочетание клавиш Ctrl+O (или Ctrl+щ).

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

1. при необходимости развернуть список Тип файлов: и выбрать тип, соответствующий типу открываемого файла;

2. при необходимости развернуть список Папка: и, действуя, как в окне Мой компьютер, выбрать нужное дисковое устройство и открыть родительскую папку, содержащую нужный файл;

3. пользуясь полосой прокрутки, вывести строку с названием отрываемого файла в зону видимости и дважды щелкнуть клавишей мыши на этой строке.

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

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

В большинстве приложений Windows операция текущего сохранения может быть выполнена одним из следующих способов:

· выполнить команду Файл > Сохранить окна приложения;

· выполнить щелчок клавишей мыши по значку Сохранить панели инструментов окна приложения (если панель и значок находятся в окне);

· использовать сочетание клавиш Ctrl+S (или Ctrl+ы).

Эта команда не выводит на экран диалоговое окно, так как сохранение документа осуществляется в той же самой папке и подтем же именем, что и старый вариант документа.

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

Если документ, в который вносились изменения, в дальнейшей текущей работе с данным приложением уже не требуется, его следует закрыть. Закрытие файла документа в приложениях Windows выполняется по команде Файл > Закрыть.

Если перед выполнением операции закрытия пользователь вносил в документ изменения и по каким-либо причинам не выполнил их сохранение, то операционная система выведет на экран окно предупреждения и предложит три варианта действий: сохранить изменения с помощью кнопки Да, не сохранять изменения и вернуться к предыдущему состоянию документа нажатием кнопки Нет и отменить выполнение операции закрытия документа с помощью кнопки Отмена.

Дата добавления: 2015-08-11 ; просмотров: 545 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Источник

Операционная система Microsoft Windows 3.1 для программиста

4.2. Функции Windows для работы с файлами

С помощью функций, входящих в состав программного интерфейса операционной системы Windows вы можете выполнять над файлами те же операции, что и в среде MS-DOS. Это открытие, закрытие, чтение, запись, позиционирование, удаление и т. п.

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

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

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

Функция возвращает идентификатор файла, который можно (и нужно) использовать во всех последующих операциях с файлом или -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 следующим образом:

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

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

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

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

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

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

Функция возвращает идентификатор открытого файла или 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:

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

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

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

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

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

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

Стандартные диалоговые панели для открытия файлов

В составе операционной системы Windows версии 3.1 имеется DLL-библиотека commdlg.dll, экспортирующая среди прочих две функции, очень удобные для организации пользовательского интерфейса при открытии файлов. Это функции GetOpenFileName и GetSaveFileName . Мы уже пользовались этими функциями в приложениях OEM2ANSI и OEM3ANSI.

Функция GetOpenFileName выводит на экран стандартную или измененную приложением диалоговую панель «Open», позволяющую выбрать файл (рис. 4.1).

Рис. 4.1. Диалоговая панель «Open»

Функция GetSaveFileName выводит стандартную или измененную приложением диалоговую панель «Save As. » (рис. 4.2).

Рис. 4.2. Диалоговая панель «Save As. «

Внешний вид этих диалоговых панелей определяется структурой типа OPENFILENAME , определенной в файле commdlg.h (этот файл находится в каталоге include системы разработки Borland C++ или Microsoft Visual C++):

Адрес структуры передается функциям GetOpenFileName и GetSaveFileName в качестве параметра lpofn:

Обе функции возвращают ненулевое значение, если пользователь сделал выбор файла, и ноль, если он отказался от выбора, нажав кнопку «Cancel» или выбрав строку «Close» из системного меню диалоговой панели. Нулевое значение возвращается также при возникновении ошибки.

В результате выбора некоторые поля структуры будут заполнены информацией о выбранном файле.

Опишем назначение отдельных полей структуры OPENFILENAME.

lStructSize

Поле lStructSize перед вызовом функций должно содержать размер структуры OPENFILENAME в байтах.

Flags

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

Флаг Описание
OFN_ALLOWMULTISELECT Разрешается выбор нескольких файлов одновременно. Если указан этот флаг, после выбора поле lpstrFile будет указывать на буфер, заполненный именами выбранных файлов (или путями к выбранным файлам), разделенными пробелом
OFN_CREATEPROMPT При использовании этого флага если указанный файл не существует, создается диалоговая панель, в которой предлагается создать файл. Этот флаг устанавливается автоматически при использовании флагов OFN_PATHMUSTEXIST и OFN_FILEMUSTEXIST
OFN_ENABLEHOOK Разрешается использовать функцию фильтра, адрес которой указан в поле lpfnHook
OFN_ENABLETEMPLATE Если указан этот флаг, для создания диалоговой панели Windows будет использовать шаблон, определяемый содержимым полей hInstance и lpTemplateName
OFN_ENABLETEMPLATEHANDLE При использовании этого флага поле hInstance используется для идентификации блока памяти, содержащий предварительно загруженный шаблон диалоговой панели. В этом случае содержимое поля lpTemplateName игнорируется
OFN_EXTENSIONDIFFERENT Устанавливается после возвращения из функции и указывает, что расширение возвращенного имени файла отличается от заданного в поле lpstrDefExt. Этот флаг не устанавливается, если перед вызовом функции в поле lpstrDefExt было записано значение NULL, или если файл не имеет расширения имени
OFN_FILEMUSTEXIST Можно выбирать только имена тех файлов, которые существуют. Если в поле «File Name» диалоговой панели набрать имя несуществующего файла, на экране появится диалоговая панель с предупреждающим сообщением
OFN_HIDEREADONLY Убрать переключатель «Read Only»
OFN_NOCHANGEDIR Для выбора используется каталог, который был текущим при вызове функции
OFN_NOREADONLYRETURN Выбранные файлы не могут иметь атрибут «только чтение» или располагаться в защищенном от записи каталоге
OFN_NOTESTFILECREATE Перед завершением работы диалоговой панели создание файла не выполняется. Не выполняются и проверки на переполнение диска, защиту записи или наличие доступа в сети
OFN_NOVALIDATE В возвращаемом имени файла могут присутствовать неразрешенные символы
OFN_OVERWRITEPROMPT Используется для диалоговой панели «Save As. «. Если выбранный файл существует, на экран выводится диалоговая панель с предупреждением
OFN_PATHMUSTEXIST Можно вводить только существующие пути к файлам
OFN_READONLY После вызова функции переключатель «Read Only» будет находиться во включенном состоянии
OFN_SHAREWARE Флаг устанавливается после возвращения из функции и указывает, что при вызове функции OpenFile произошла ошибка при совместном доступе к файлу в сети
OFN_SHOWHELP Если указан этот флаг, в диалоговой панели будет создана кнопка «Help». Если указан этот флаг, поле hwndOwner не должно содержать значение NULL

hwndOwner

Поле hwndOwner должно содержать идентификатор окна, создавшего диалоговую панель. Можно указать значение NULL, при этом диалоговая панель не будет иметь окно-владельца. В этом случае нельзя использовать флаг OFN_SHOWHELP.

hInstance

Поле hInstance используется перед вызовом функции для идентификации блока памяти, содержащего шаблон диалоговой панели. Содержимое поля игнорируется в том случае, если не указаны флаги OFN_ENABLETEMPLATE или OFN_ENABLETEMPLATEHANDLE.

lpstrFilter

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

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

Первая строка в паре строк описывает название фильтра, например «Text Files» (текстовые файлы), во второй строке пары через символ «;» перечисляются возможные шаблоны для имен файлов.

lpstrCustomFilter

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

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

Первая строка в паре строк описывает название фильтра, например «Text Files» (текстовые файлы), во второй строке пары через символ «;» перечисляются возможные шаблоны для имен файлов.

Если поле lpstrFilter содержит NULL, используется фильтр lpstrCustomFilter.

nMaxCustFilter

Определяет размер буфера в байтах, указанного в поле lpstrCustomFilter. Размер этого буфера должен быть не меньше 40 байт.

nFilterIndex

Поле nFilterIndex определяет номер пары строк, используемой для фильтра, указанного в поле lpstrFilter. Если в качестве значения для этого поля указать 0, будет использован фильтр, определенный в поле lpstrCustomFilter.

lpstrFile

Поле lpstrFile должно содержать адрес текстовой строки, в которую будет записан полный путь к выбранному файлу.

Если по указанному выше адресу перед вызовом функции GetOpenFileName или GetSaveFileName расположить текстовую строку, содержащую путь к файлу, этот путь будет выбран по умолчанию сразу после отображения диалоговой панели «Open» или «Save As. «.

nMaxFile

Поле nMaxFile должно содержать размер в байтах буфера, расположенного по адресу, указанному в поле lpstrFile.

Размер этого буфера должен быть достаточным для записи полного пути к файлу. Файловая система MS-DOS допускает использование для указания пути к файлу не более 128 символов.

lpstrFileTitle

В поле lpstrFileTitle необходимо записать адрес буфера, в который после выбора будет записано имя файла с расширением, но без пути к файлу. Это поле должно быть использовано приложением для отображения имени выбранного файла.

nMaxFileTitle

Поле nMaxFileTitle должно содержать размер указанного выше буфера.

lpstrInitialDir

Поле lpstrInitialDir позволяет указать начальный каталог, который будет выбран для поиска файла сразу после отображения диалоговой панели «Open». Для того чтобы начать поиск в текущем каталоге, в это поле следует записать значение NULL.

lpstrTitle

С помощью этого поля можно определить заголовок диалоговой панели, появляющейся при вызове функции. Если это поле содержит NULL, будут использованы стандартные заголовки «Open» и «Save As. «.

nFileOffset

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

nFileExtension

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

lpstrDefExt

Указатель на буфер, который содержит расширение имени файла, используемое по умолчанию. Это расширение добавляется к имени выбранного файла, если при выборе расширение имени не было указано.

lCustData

Значение, передаваемой функции фильтра через параметр lParam.

lpfhHook

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

lpTemplatename

Идентификатор ресурса, содержащего шаблон диалоговой панели, используемого вместо имеющегося в DLL-библиотеке commdlg.dll. Для ссылки на ресурс можно использовать макрокоманду MAKEINTRESOURCE. Для использования альтернативного шаблона (и, соответственно, данного поля), в поле Flags следует установить флаг OFN_ENABLETEMPLATE.

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

Теперь о том, как закрыть файл. Для закрытия файла вы должны использовать функцию _lclose :

Идентификатор закрываемого файла передается функции через параметр hf.

Если файл закрыт успешно, функция _lclose возвращает нулевое значение. При ошибке возвращается значение HFILE_ERROR.

Создание файлов

Для создания файлов вы можете использовать как универсальную функцию OpenFile, описанную нами ранее, так и более простую функцию _lcreat :

В качестве параметра lpszFileName этой функции необходимо передать адрес строки, содержащей путь к создаваемому файлу в кодировке ANSI.

С помощью параметра fuAttribute можно определить атрибуты создаваемого файла:

Значение атрибута Описание
0 Нормальный файл, для которого разрешено выполнение операций чтения и записи
1 Этот файл можно открыть только для чтения
2 Скрытый файл
3 Системный файл

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

Чтение и запись

Для выполнения операций чтения и записи в программном интерфейсе операционной системы Windows версии 3.1 предусмотрены четыре функции: _lread, _hread, _lwrite, _hwrite.

Функция _lread предназначена для чтения из открытого файла:

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

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

Прочитанные данные будут записаны в буфер hpvBuffer, имеющий размер cbBuffer байт. Этот буфер можно получить динамически, вызывав, например, функцию GlobalAlloc или LocalAlloc. Размер буфера не должен превышать 65534 байт.

В программном интерфейсе операционной системы Windows версии 3.1 появилась функция _hread , с помощью которой можно выполнять чтение из файла блоков практически любого размера:

Так же как и функция _lread, функция _hread возвращает количество байт данных, прочитанных из файла. Возвращенное значение может быть меньше затребованного в параметре cbBuffer, если в процессе чтения был достигнут конец файла. При ошибке функция возвращает значение HFILE_ERROR.

Вы можете с помощью функции GlobalAlloc заказать для функции _hread буфер размером, большим 64 Кбайт.

С помощью функции _lwrite вы можете выполнить запись данных в файл:

Назначение параметров этой функции аналогично назначению параметров функции _lread. Перед вызовом функции _lwrite буфер должен содержать записываемые в файл данные.

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

Если вам надо писать в файл блоки, имеющие размер больше 64 Кбайт, воспользуйтесь функцией _hwrite , которая впервые появилась в программном интерфейсе Windows версии 3.1:

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

Позиционирование

Для выполнения операции позиционирования внутри файла приложения Windows могут использовать функцию _llseek :

Функция _llseek перемещает указатель текущей позиции в файле на lOffset байт, причем направление смещения зависит от значения параметра nOrigin следующим образом:

Значение Описание
SEEK_SET Указатель текущей позиции в файле перемещается на lOffset байт от начала файла
SEEK_CUR Указатель текущей позиции в файле перемещается на lOffset байт от текущей позиции
SEEK_END Указатель текущей позиции в файле перемещается на lOffset байт от конца файла

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

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

Определение типа устройства ввода/вывода

Иногда приложению требуется определить тип и расположение используемого дискового устройства ввода/вывода. Для этого можно воспользоваться функцией GetDriveType :

Параметр DriveNumber определяет номер диска, для которого требуется определить тип и расположение (0 соответствует устройству A:, 1 — B:, и т. д.).

Функция может вернуть 0 при ошибке или одно из следующих значений:

Значение Описание
DRIVE_REMOVABLE Сменный диск
DRIVE_FIXED Несменный диск
DRIVE_REMOTE Удаленный диск, расположен на другой машине в сети

Использование стандартной библиотеки транслятора

Для работы с файлами в приложениях Windows вы можете использовать функции из стандартной библиотеки транслятора C или C++, такие как read , fread , write , fwrite , lseek , fstat , tell , close .

Можно также использовать функции потокового ввода/вывода , если преобразовать идентификатор файла в указатель на структуру FILE при помощи функции fdopen . Для того чтобы закрыть такой файл следует воспользоваться функцией fclose .

Перечисленные выше функции были описаны в третьей книге первого тома «Библиотеки системного программиста» в главе «Файловая система DOS».

Проверка присутствия share.exe

Как мы уже говорили, в многозадачной среде утилита MS-DOS share.exe приобретает особое значение, выступая координатором доступа работающих параллельно приложений к файлам. Для того чтобы приучить забывчивых или беспечных пользователей не удалять команду загрузки этой утилиты из файла autoexec.bat вы можете сделать так, чтобы ваше приложение выдавала предупреждающее сообщение, если утилита share.exe не загружена.

Однако проблема не так проста, как кажется. Для того чтобы определить, загружена ли утилита share.exe , программы MS-DOS могли воспользоваться функцией 1000h прерывания INT 2Fh. Эта функция используется самой утилитой share.exe для предотвращения повторной загрузки.

Но вызвав эту функцию из приложения Windows, вы можете, к своему огорчению, убедиться, что она всегда сообщает о том, что share.exe загружена в память, даже если вы вообще стерли файл share.exe с диска. Это сделано специально, но не для того чтобы затруднить обнаружение share.exe, а для того чтобы предотвратить ее загрузку из виртуальной машины MS-DOS, работающей в среде Windows.

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

В качестве такой функции проще всего использовать блокирование участка файла (функция 0x5c прерывания INT 21h). Как мы уже говорили, Windows выполняет эмуляцию большого числа функций прерывания MS-DOS, позволяя приложениям Windows обращаться к этим функциям.

В листинге 4.1 приведены исходные тексты приложения ISSHARE, которое проверяет присутствие share.exe, выполняя попытку заблокировать первый байт созданного временного файла.

Листинг 4.1. Файл isshare/isshare.cpp

Функция WinMain проверяет, загружена ли утилита share.exe, вызывая функцию ShareLoaded, определенную в приложении.

Эта функция может вернуть 0, 1 или -1. Если функция вернула 0, share.exe не загружена. Если функция вернула -1, произошла ошибка при создании временного файла. И, наконец, если функция ShareLoaded вернула 1, share.exe загружена.

Для создания временного файла используется функции GetTempFileName и _lcreat. Первая из этих двух функций получает имя временного файла, вторая — создает и открывает временный файл.

Для выполнения блокировки приложение вызывает функцию MS-DOS, пользуясь известной вам функцией intdos.

Если утилита share.exe установлена и блокировка файла выполнена успешно, функция ShareLoaded разблокирует файл, вызывая функцию MS-DOS с кодом 0x5c еще раз, но с другим значением регистра AL.

В любом случае перед возвратом из функции временный файл закрывается функцией _lclose и затем удаляется функцией OpenFile.

Файл определения модуля для приложения ISSHARE приведен в листинге 4.2.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Создание загрузочной флешки с помощью ultraiso windows
  • Создание загрузочной флешки с несколькими установочными образами windows
  • Создание загрузочной флешки для установки windows 7
  • Создание загрузочной флешки для восстановления windows 7
  • Создание загрузочной флешки windows через ассистент boot camp на маке с дисководом