Система сбора и мониторинга информации с удаленных информационных ресурсов

Закрытая и открытая модели описания содержимого элемента. Подсистема работы с файлами, схемы. Правила создания XML- документа. Функциональные возможности уровня приложения. Подсистема "Сбор и мониторинг информации". Формат метаданных описания ресурса.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 07.06.2012
Размер файла 2,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

INTERNET_FLAG_ASYNC

По завершению операции производится обращение к функции с обратным вызовом с передачей состояния INTERNET_STATUS_REQUEST_COMPLETE.

INTERNET FLAG OFFLINE

Эта функция состояния с обратным вызовом обсуждается позже в разделе "Отслеживание состояния сеанса". Все запросы на загрузку выполняются только из постоянного кэша. Если затребованный файл в кэше не найден, запрос терпит сбой.

По завершении всех операций Internet необходимо вызвать метод Close, чтобы освободить объект сеанса Internet перед уничтожением объекта CInternetSession.

5.3.1.5 Открытие URL и соединений

Что можно сделать, имея объект CInternetSession? Доступно несколько вариантов выбора. Можно открыть URL для загрузки файла или открыть соединение с одним из трех типов серверов и работать с ним. Открыв соединение, можно выполнять любые стандартные действия клиента конкретного приложения, к которому было произведено подключение.

OpenURL

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

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

Таблица 14. Типы файлов протоколов OpenURL

Протокол URL

Тип возвращаемого файла

file://

http://

ftp://

CStdioFile*

CHttpFile*

ClnternetFile*

Протокол file:// возвращает файлы с локальных или сетевых дисков.

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

Таблица 15. Опции OpenURL

Значение

Описание

INTERNET_FLAG_TRANSFER_ASCII

Установка по умолчанию; файлы передаются как текст ASCII.

INTERNET_FLAG_TRANSFER_BINARY

Файлы передаются в двоичном режиме.

INTERNET_FLAG_RELOAD

Файл получается с сервера даже в том случае, если кэширован

INTERNET_FLAG_DONT_CACHE

локально.

INTERNET_FLAG_SECURE

Не кэшировать файл локально и на любом из шлюзов или серверов.

INTERNET OPEN FLAG USE EXISTING CONNECT

Применим только для HTTP URL; этот флаг указывает использовать Secure Sockets Layer или РСТ для безопасной транзакции.

INTERNET FLAG PASSIVE

По возможности повторно использовать соединение с сервером для новых запросов, генерируемых функцией OpenURL, а не открывать новое соединение для каждого запроса. Применим только для FTP URL-; использовать пассивные опции FTP

Два последних параметра предназначены для применения с серверами HTTP. Четвертый параметр является строкой, содержащей все дополнительные заголовки, отправляемые серверу HTTP. Пятый параметр содержит длину дополнительных заголовков, передаваемых в четвертом параметре. Типичный пример применения функции OpenURL:

CHttpFile* pURLFile;

CInternetSession isSession;

CString sURL;

CString sHeaders;

sURL = "http: //www.myserver.com/file_to_get.html" ;

sHeaders = "X-Application=My Web Browser";

pURLFile = isSession. OpenURL(sURL, 1, INTERNET_FLAG_TRANSFER_ASCII | INTERNET_FLAG_RELOAD, sHeaders, sHeaders.GetLength() ) ;

Еще один, более базовый пример OpenURL с указанием URL выглядит так:

CHttpFile* pURLFile;

CInternetSession isSession;

CString sURL;

sURL = "http: //www. myserver. com/f ile_to_get. html" ;

pURLFile -- isSession.OpenURL(sURL);

GetHttpConnection

Метод GetHttpConnection используется для создания объекта CHttpConnection. Этот метод открывает соединение с указанным сервером HTTP, а для выполнения всех необходимых действий следует обратиться к соответствующим методам CHttpConnection. Метод GetHttpConnection возвращает указатель на объект CHttpConnection.

Первым параметром метода является имя сервера, к которому производится подключение. Это единственный необходимый параметр метода GetHttpConnection. Во втором параметре принимается номер порта, через который осуществляется подключение к серверу HTTP. Третьим параметром является имя пользователя, если для доступа к HTTP-серверу необходима авторизация. Четвертым параметром является пароль для указанной учетной записи. Типичный пример применения метода GetHttpConnection выглядит следующим образом:

CHttpConnection* pConnect; CInternetSession isSession; CString sServer;

sServer = "www.myserver.com ";

pConnect = isSession.GetHttpConnection(sServer);

Более сложный пример подключения с авторизацией выглядит так:

CHttpConnection* pConnect;

CInternetSession isSession;

CString sServer;

CString sUserName;

CString sPassword;

sServer = "www.myserver.com ";

sUserName = "MyName";

sPassword = "MyPassword";

pConnect = isSession.GetHttpConnection(sServer, 80, sUserName, sPassword);

GetFtpConnection

Метод GetFtpConnection очень похож на метод GetHttpConnection. Ему требуется такая же информация с единственным дополнением -- несколько другим порядком следования параметров. Метод GetFtpConnection возвращает указатель на объект CFtpConnection.

Как и в методе GetHttpConnection, первым параметром данного метода является имя сервера. Он является единственным необходимым параметром, хотя очень часто для FTP-сервера будут также требоваться второй и третий параметры. Вторым параметром является имя пользователя, под которым производится подключение, если для доступа к FTP-серверу необходима авторизация. Третий параметр хранит пароль указанной учетной записи. Четвертым параметром является номер порта, через который производится подключение. Существует и пятый параметр, булевское значение, при установке которого в TRUE клиент будет работать в пассивном режиме FTP.

Типичный пример применения метода GetFtpConnection выглядит следующим образом:

CFtpConnection* pConnect;

CInternetSession isSession;

CString sServer;

CString sUserName;

CString sPassword;

sServer = "ftp.myserver.com";

sUserName = "MyName" ;

sPassword = "MyPassword" ;

pConnect = isSession.GetFtpConnection(sServer, sUserName, sPassword);

5.3.1.6 Работа с cookie-наборами

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

Первой функцией является SetCookie, размещающая cookie-набор на компьютере, где выполняется приложение. Функция SetCookie принимает три параметра. Первым параметром является URL, по которому отправляется cookie-набор. Второй параметр хранит имя cookie-набора, а третий -- его значение. Типичный пример применения функции SetCookie выглядит следующим образом:

CInternetSession isSession; CString sURL;

CString sCookieName; CString sCookieValue;

sURL = "www.myserver.com ";

sCookieName = "MyCookie" ;

sCookieValue = "MyValue" ;

if (isSession . SetCookie (sURL, sCookieName, sCookieValue)

Следующая функция для работы с cookie-наборами позволяет получать cookie-наборы из пользовательского компьютера. Эта функция, GetCookie, имеет две несколько различающихся версии. Обе версии в первом параметре принимают URL, а во втором -- имя получаемого cookie-набора. Первая версия в третьем параметре принимает указатель на строку, а в четвертом -- размер буфера. Вторая версия в третьем параметре принимает адрес объекта CString.

При использовании первой версии функции GetCookie, вероятно, потребуется прибегнуть к услугам третьей функции для работы с cookie-набором, т.е. к GetCookieLength, определяющей необходимый размер буфера. Функция принимает в своих двух параметрах URL и имя cookie-набора и возвращает его размер. Ниже показан типичный пример применения обоих функций:

CInternetSession CString isSession; CString sURL;

char* sCookieName; DWORD

sCookieValue; dwCookieLength ;

sURL = "www.myserver.com " ;

sCookieName = "MyCookie";

dwCookieLength = GetCookieLength(sURL, sCookieName);

sCookieValue = new char[(dwCookieLength + 1) ] ;

if(isSession.GetCookie(sURL, sCookieName, sCookieValue, (dwCookieLength + 1) )

Пример использования второй версии функции GetCookie может выглядеть так:

CInternetSession isSession;

CString sURL;

CString sCookieName;

CString sCookieValue;

sURL = "www.myserver.com " ;

sCookieName = "MyCookie";

if(isSession.GetCookie(sURL, sCookieName, SsCookieValue)

5.3.1.7 Отслеживание состояния сеанса

Для отслеживания в рамках своего приложения состояния Internet-соединений существует несколько функций. При создании собственного потомка класса CInternetSession можно переопределить метод OnStatusCallback. Этот метод вызывается в режиме ожидания выполнения операции и принимает информацию о состоянии операции. Прежде чем сможет работать функция с обратным вызовом OnStatusCallback, ее необходимо разрешить, обратившись к EnableStatusCallback. Функция EnableStatusCallback принимает одну булевскую переменную, разрешая или запрещая работу функции обратного вызова OnStatusCallback.

Функция OnStatusCallback объявлена следующим образом:

virtual void OnStatusCallback(DWORD dwContext, DWORD dwlnternetstatus, LPVOID IpvStatusInformation, DWORD dwStatusInformationLength);

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

Таблица 16 Индикаторы состояния соединения с Internet

Значение

Описание

INTERNET_STATUS_RESOLVING_NAME

Определение IP-адреса сервера.

INTERNET_STATUS_NAME_RESOLVED

IP-адрес сервера был определен.

INTERNET_STATUS_CONNECTING_TO_SERVER

Подключение по указанному IP-адресу.

INTERNET_STATUS_CONNECTED_TO_SERVER

Успешное подключение по IP-адресу.

INTERNET_STATUS_SENDING_REQUEST

Отправка информации серверу. Параметр IpvStatuslnformation равен NULL.

INTERNET_STATUS_REQUEST_SENT

Информация успешно отправлена серверу. Параметр IpvStatuslnformation равен NULL.

INTERNET_STATUS_RECEIVING_RESPONSE

Ожидание ответа сервера. Параметр IpvStatuslnformation равен NULL.

INTERNET_STATUS_RESPONSE_RECEIVED

Ответ успешно получен с сервера. Параметр IpvStatuslnformation равен NULL.

INTERNET_STATUS_CLOSING_CONNECTION

Закрытие соединения с сервером. Параметр IpvStatuslnformation равен NULL.

INTERNET_STATUS_CONNECTION_CLOSED

Соединение с сервером закрыто. Параметр IpvStatuslnformation равен NULL.

INTERNET_STATUS_HANDLE_CREATED

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

INTERNET_STATUS_HANDLE_CLOSED

Указывает, что соединение, с которым сопоставляется дескриптор, было закрыто.

INTERNET STATUS REQUEST COMPLETE

Сообщает о завершении асинхронного запроса.

При переопределении функции OnStatusCallback необходимо вызвать макрос AFX_MANAGE_STATE непосредственно после входа в функцию OnStatusCallback. Типичный пример применения функции OnStatusCallback выглядит следующим образом:

// разрешить функцию с обратным вызовом выдачи состояния m_misSession.EnablestatusCallback(TRUE);

void CMylnternetSession::OnStatusCallback(DWORD dwContext, DWORD dwInternetStatus,

LPVOID IpvStatusInformation, DWORD dwStatusInformationLength) (

// Получить модуль состояния MFC (это необходимо)

AFX_MANAGE_STATE (AfxGetAppModuleState () ) ;

// Какое новое состояние сеанса соединения с Internet?

switch (dwInternetStatus)

// Разрешение имени сервера

case INTERNET STATUS RESOLVING NAME:

В классе CInternetSession представлены еще две функции для получения информации о состоянии. Первая позволяет определить тип сервера, к которому производится подключение, а вторая -- идентификатор контекста конкретного объекта CInternetSession.

Функция ServiceTypeFromHandle принимает дескриптор объекта CInternetSession, получаемый оператором HINTERNET, и возвращает значение типа DWORD, указывающее тип службы для текущего сеанса. Возможные возвращаемые значения перечислены в табл. 17.

Таблица 17. Типы служб сеансов Internet

Возвращаемое значение

Тип службы

INTERNET_SERVICE_FTP

FTP

INTERNET_SERVICE_HTTP

HTTP

AFX_INET_SERVICE_FILE

File

Последней из набора информационных и статусных функций является GetContext. Эта функция не принимает параметров и возвращает значение DWORD, являющееся идентификатором контекста, который был передан посредством конструктора CInternetSession или функции OpenURL.

ClnternetFile

Класс ClnternetFile представляет собой базовый класс, от которого унаследованы все другие файловые классы Winlnet. Он унаследован от класса CStdioFile и используется для службы FTP. Он является полнофункциональных файловым классом с функциями для чтения, записи и перемещения по файлу.

5.3.1.8 Открытие и закрытие

Открытие объекта ClnternetFile производится при помощи метода OpenURL или класса CInternetSession, либо же посредством одного из классов соединений, CHttpConnection, CFtpConnection или CGopherConnection. Эти объекты и функции возвращают указатель на объект ClnternetFile или на объект CStdioFile, если функция OpenURL используется для открытия локального файла.

Если необходимо закрыть файл, доступно несколько вариантов, в зависимости от обстоятельств. Для закрытия файла очевидным образом следует вызвать метод Close. Этот метод закроет файл и освободит все буферы данных. Кроме того, если файл был открыт для записи, эта. функция вызовет метод Flush, что обеспечит перед закрытием файла отправку и получение сервером содержимого буфера записи. Если необходимо закрыть файл и уничтожить все соединения, игнорируя исключения и неотправленные данные, можно воспользоваться методом Abort, разрывающим все соединения и закрывающим файл.

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

Для чтения и записи данных в объект ClnternetFile служат два метода. Выбор необходимого метода частично зависит от того, какой тип имеет передаваемый файл -- текст ASCII или двоичный файл.

Двумя основными операциями чтения и записи данных являются Read и Write. Обе этих функции в первом параметре принимают указатель на буфер, а во втором -- значение UINT, содержащее размер буфера. В функции Read в этот буфер будут помещаться данные, полученные от объекта CInternetFile, а сама функция вернет значение типа UINT, указывающее сколько данных было прочитано в буфер. В функции Write данные, записываемые в объект CInternetFile, должны быть помещены в буфер, на который указывает первый параметр, а во втором параметре необходимо передать количество записываемых байтов буфера.

Альтернативой функциям Read и Write являются функции ReadString и WriteString. Функция ReadString может принимать указатель на объект CString, в который будет читаться входной файл. Кроме того, эта функция, как и Read, может принимает указатель на буфер и размер входного буфера. Функция ReadString будет читать данные размера входного буфера, пока не достигнет символа возврата строки. Функция принимает указатель на строку, завершающуюся символом NULL, и записывает строку в выходной файл на сервере.

Для чтения файла HTTP существует еще одна функция, позволяющая перемещаться по файлу. Функция Seek позволяет проводить произвольный доступ к файлам типа CHttpFile (в текущее время она не поддерживается другими типами Internet-файлов). Функция Seek принимает два параметра. Первый параметр определяет, насколько перемещать позицию файла и в каком направлении (положительные значения позволяют перемещаться вперед по файлу, тогда как отрицательные значения перемещают назад), а второй параметр определяет точку файла, от которой следует проводить перемещение. Возможные значения этой точки перечислены в табл. 18.

Таблица 18. Начальные позиции для функции Seek файла Internet

Значение

Описание

CFile::begin

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

CFile::current

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

CFile::end

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

5.3.1.10 Управление буфером

В классе CInternetFile существует еще две функции, определяющих способ проведения соединений через Internet. Они управляют размером коммуникационных буферов чтения и записи. Буферы чтения и записи используются для хранения данных, отправляемых на сервер, до тех пор, пока они не будут отравлены через Internet и получены сервером, и для хранения данных, получаемых от сервера до тех пор, пока приложение не сможет прочитать их из буфера. Обе функции, SetWriteBufferSize и SetReadBufferSize, принимают одно значение типа UINT, определяющее новый размер буфера, и возвращают булево значение, определяющее, успешно ли было проведено выделение памяти под буфер.

ClnternetException

При порождении исключения любым из классов Winlnet, для его обработки следует воспользоваться классом ClnternetException. Класс ClnternetException имеет два свойства, определяющих тип ошибки и действия, необходимые для ее исправления. Первый элемент, m_dwError, является идентификатором ошибки. Он может быть любой ошибкой Windows, определенной в файле WINERROR.H, или ошибкой работы с Internet, определенной в WININET.H.

Вторым элементом класса ClnternetException является m_dwContext, хранящий идентификатор контекста потока, в котором произошло исключение. Этот идентификатор контекста предоставляется в процессе создания экземпляра CInternetSession или в функции OpenURL.

ClnternetConnection

Класс ClnternetConnection представляет собой один из классов, которые редко используются непосредственно. Он является базовым для классов CHttpConnection, CFtpConnection. Создается он вызовом функций GetHttpConnection, GetFtpConnection.

Класс ClnternetConnection содержит только три функции. Функция GetContext может быть вызвана для получения идентификатора контекста соединения. Функция GetSession может использоваться для получения указателя на экземпляр CInternetSession, создавшего соединение. Функцию GetServerName можно применить для получение имени сервера, к которому производится подключение.

Функциональные возможности уровня приложения

Рассмотренные классы Winlnet являются базовыми классами, от которых наследуются классы уровня приложения. Классы уровня приложения предоставляют функциональные возможности, характерные для приложения. Классы HTTP могут применяться только для соединения и взаимодействия с Web-сервером по протоколу HTTP. Классы FTP могут использоваться только с FTP-серверами. Именно на этом уровне классы Winlnet приобретают большую часть гибкости и полезности.

Классы HTTP

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

CHttpConnection

Класс CHttpConnection содержит всего один метод OpenRequest. Эта функция имеет две версии, различия между которыми практически неуловимы. Единственным различием является первый параметр -- команда HTTP, отправляемая серверу.

В первой версии функции OpenRequest команда HTTP передается в виде указателя на строку, содержащую команду HTTP. Если в этом параметре передается NULL, в качестве команды по умолчанию подразумевается команда GET. Вторая версия функции OpenRequest принимает целую константу, определяющую отправляемую серверу команду HTTP. Возможные значения параметра сведены в табл. 19.

Таблица 19. Значения параметра команды HTTP

Команда HTTP

Целое значение

HTTP VERB POST

0

HTTP VERB GET

1

HTTP VERB HEAD

2

HTTP_VERB_PUT

3

HTTP VERB LINK

4

HTTP VERB DELETE

5

HTTP VERB UNLINK

6

Начиная со второго параметра, обе версии функции OpenRequest идентичны. Вторым параметром является строка, содержащая целевой объект (обычно файл) указанной команды HTTP. Третьим параметр представляет строку, содержащую URL документа, в котором порождается текущий запрос. Если в этом параметре передать NULL, заголовок HTTP не будет определен.

Четвертый параметр хранит идентификатор контекста данной операции. Он будет возвращаться в функции OnStatusCallback для идентификации этой конкретной транзакции. Третьим параметром является строка, в которой указаны типы, которые может принимать ваше приложение. Пятый параметр представляет собой строку, содержащую список типов файлов MIME, которые приложение может принимать и понимать. Это не помешает Web-серверу отправить файл, тип которого ваше приложение не понимает, однако он сможет воздействовать на процессы CGI, вызываемые с помощью команд PUT и POST.

Шестой параметр содержит строку, определяющую поддерживаемую приложением версию протокола HTTP. Если в этом параметре передать NULL, поддерживаемой версией будет считаться НТТР/1, что и отправится серверу. Седьмым и последним параметром является флаг, определяющий различные установки по обработке команды. Возможные значения этого флага сведены в табл. 20.

Таблица 20. Опции OpenRequest

Значение

Описание

INTERNET_FLAG_RELOAD

Файл получается с сервера даже в том случае, если он кэширован локально.

INTERNET_FLAG_DONT_CACHE

Не кэшировать файл локально и на любом из шлюзов или серверов.

INTERNET_FLAG_SECURE

Применим только для HTTP URL; этот флаг указывает на необходимость использования Secure Sockets Layer или РСТ для безопасной транзакции.

INTERNET_FLAG_MAKE_PERSISTENT

Добавляет возвращенный объект в локальный кэш как постоянную сущность, которая не будет удаляться вплоть до момента очистки кэша.

INTERNET FLAG NO AUTO REDIRECT

Указывает, что перенаправления HTTP не должны обрабатываться; автоматически.

Если для функции OpenURL из URL необходимо извлечь имена сервера и объекта, можно воспользоваться функцией AfxParseURL. Функция AfxParseURL принимает в первом параметре полный URL и разбивает его на несколько частей. Протокол возвращается во втором параметре в виде указателя на переменную DWORD. Возможные значения этой константы перечислены в табл. 21.

Таблица 21. Типы протоколов AfxParseURL

AFX_INET_SERVICE_FTP

FTP

AFX_INET_SERVICE_HTTP

HTTP

AFX_INET_SERVICE_HTTPS

HTTPS (HTTP с Secure Sockets Layer)

AFX_INET_SERVICE_GOPHER

Gopher

AFX_INET_SERV1CE_FILE

Локальный файл

AFX_INET_SERVICE_MAILTO

Электронная почта SMTP

AFX_INET_SERVICE_NEWS

Дискуссионные группы Usenet

AFX_INET_SERVICE_NNTP

NNTP (Дискуссионные группы Usenet)

AFX_INET_SERVICE_TELNET

Telnet (Терминальный сетевой сеанс)

AFX_INET_SERVICE_WAIS

WAIS

AFX_INET_SERVICE_MID

MID

AFXJNET_SERVICE_CID

CID

AFX_INET_SERVICE_PROSPERO

PROSPERO

AFX_INET_SERVICE_AFS

AFS

AFX INET SERVICE UNK

Неизвестный тип

Третьим параметром является указатель на строку, в которой будет размещаться имя сервера. Четвертый параметр -- указатель на строку, в которую поместиться получаемый объект. Пятым параметром является указатель на переменную WORD (с типом INTERNET_PORT), в которую сохраняется номер порта. Типичный пример применения функций AfxParseURL и OpenRequest выглядит следующим образом:

CHttpConnection* pConnect;

CHttpFile* pFile;

CInternetSession isSession;

CString sServer; CString sURL;

CString sObjectName;

INTERNET_PORT wPort;

DWORD dwProtocol;

sURL = "http://www.myserver .com/this_file.html" ;

if (AfxParseURL(sURL, sdwProtocol, SsServer, ssObjectName, swPort);

if (dwProtocol == AFX_INET_SERVICE_HTTP)

pConnect = isSession.GetHttpConnection(sServer, wPort); if (pConnect)

pFile = pConnect->OpenRequest ("GET" , (LPCSTR)sObjectName);

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

5.3.1.11 CHttpFile

Класс создается при каждом вызове метода OpenRequest класса CHttpConnection или метода OpenURL класса CInternetSession, запрашивающего ресурс HTTP. Имея корректный объект CHttpFile, можно настроить запрос, отправляемый Web-серверу. Запрос пока еще не отправлен серверу; пока он только создан и упакован в форму объекта CHttpFile. С этого момента можно добавлять дополнительные заголовки, подключать к запросу данные для отправки по командам POST и PUT.

5.3.1.12 Упаковка и отправка запроса

При наличии корректного объекта CHttpFile, перед отправкой запроса можно добавить два дополнительных заголовка, воспользовавшись функцией AddRequestHeaders. Эта функция имеет две версии, различающиеся в том, как запросу передаются заголовки. Первая версия в первом параметре принимает указатель на строковый буфер, содержащий новые заголовки, а в третьем параметре -- размер буфера. Вторая версия функции в первом параметре принимает указатель на объект CString. При включении в запрос нескольких заголовков заголовки должны разделяться комбинацией CR/LF. В обоих версиях функции второй параметр хранит флаг, определяющий, что следует делать с передаваемым заголовками (табл. 22).

Таблица 22. Значения флага функции AddRequestHeaders

Значение

Описание

HTTP_ADDREQ_FLAG_COALESCE

Объединяет заголовки с одинаковыми именами.

HTTP_ADDREQ_FLAG_REPLACE

Заменяет заголовки с одинаковыми именами. Если значение заголовка найдено, а значение нового заголовка пусто, заголовок удаляется. Эта опция позволяет передать только один заголовок.

HTTP_ADDREQ_FLAG_ADD_IF_NEW

Добавляет заголовок только в том случае, если он еще не существует.

HTTP_ADDREQ_FLAG_ADD

Используется с REPLACE; добавляет заголовок, если он не существует.

Когда все готово к отправке, запрос сервера можно провести с помощью функций SendRequest или SendRequestEx. Функция SendRequest принимает в первом параметре список имен заголовков, отправляемых с запросом. Передавая указатель на этот список, во втором параметре следует указать длину строки с именами заголовков. В следующем параметре можно передать указатель на буфер, содержащий данные для отправки по команде POST или PUT, за которым указать значение DWORD, определяющее размер отправляемого буфера.

Функция SendRequestEx для включения данных, отправляемых по команде POST или PUT, позволяет прибегнуть к функциям Write и WriteString класса CInternetFile. Вся уловка в том, что в функции SendRequestEx необходимо определить полный размер отправляемых данных. Отправив все данные, запрос следует закрыть, для чего служит функция EndRequest.

5.3.1.13 Получение информации о запросе

Отправив на Web-сервер запрос, можно получить информацию о возвращенном объекте. Для получения информации от запроса воспользуйтесь несколькими класса CHttpFile.

Функции Querylnfo можно передавать любой из заголовков из ответа, полученного с Web-сервера. Функция Querylnfo принимает в первом параметре значение индикатора, задающее уровень запрошенного заголовка. Возможные значения этого индикатора перечислены в табл. 23.

Таблица 23. Значения Querylnfo для уровня заголовка

Значение

Описание

HTTP_QUERY_CUSTOM

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

HTTP_QUERY_FLAG_REQUEST_HEADERS

Запрашивает заголовки запроса, отправленные серверу приложением.

HTTP_QUERY_FLAG_SYSTEMTIME

Для заголовков, значением которых является строка дата/время, возвращает значение в виде стандартной структуры Win32

HTTP_QUERY_FLAG_NUMBER

Для заголовков, значение которых является числом, возвращает значение в виде а 32-разрядного числа.

Тип второго параметра зависит от типа запрошенного заголовка и уровня заголовка, указанного в первом параметре. Обобщенным набором параметров является указатель на буфер, в который будет помещаться значение, и размер буфера. Если запрошенное значение является датой/временем и был запрошен уровень HTTP_QUERY_FLAG_SYSTEMTIME, второй параметр должен являться указателем на структуру SYSTEMTIME. Если значение является строковым, можно также передать и указатель на объект CString. Последним параметром является указатель на DWORD, определяющий индекс заголовка, используемый при получении нескольких заголовков с одинаковыми именами.

Для получения кода состояния запроса HTTP служит функция QuerylnfoStatusCode. Эта функция принимает указатель на переменную DWORD, в которую размещается код состояния запроса. Некоторые коды состояния запроса HTTP показаны в табл. 24.

Таблица 24. Некоторые значения кода состояния HTTP

Значение

Описание

200

URL обнаружен, идет передача данных.

400

Несвязный запрос.

404

Запрошенный URL не найден.

405

Сервер не поддерживает запрошенный метод.

500

Неизвестная ошибка сервера.

503

Превышено максимальное количество подключений к серверу.

Для проверки, какая команда HTTP отправлялась в запросе, воспользуйтесь функцией GetVerb, возвращающей CString с командой. Подобным образом функция GetObject возвращает имя объекта, запрошенного с сервера, а для возврата запрошенного URL полностью служит функция GetFileURL. Все три указанных функции не имеют параметров и возвращают CString.

По завершению работы с запросом следует вызвать функцию Close, закрывающую запрос и все выделенные под пего ресурсы.

Классы FTP

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

5.3.1.14 CFtpConnection

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

5.3.1.15 Каталоги и перемещение по файловой системе

Функции для работы с каталогами для класса CFtpConnection могут использоваться для перемещения по FTP-ссрвсру, а также для создания и удаления каталогов. Для начала, потребуется определить текущий каталог FTP-ссрвера. Это можно сделать при помощи одной из двух функций. Функции GetCurrentDirectory или GetCurrentDirectoryAsURL в своем единственном параметре принимают указатель па объект CString. Обе функции размещают в этой строке имя текущего каталога. Функция GetCurrentDirectoryAsURL форматирует имя каталога в виде URL, тогда как GetCurrentDirectory возвращает только имя каталога и маршрут к нему.

Навигацию по каталогам FTP-сервера реализует функция SetCurrentDirectory. Эта функция в единственном параметре принимает указатель на строку, в которой указывается имя каталога, куда производится перемещение. Она возвращает булевское значение, определяющее успешность выполнения операции.

Для создания или удаления подкаталога текущего каталога FTP-сервера используются, соответственно, функции CreateDirectory или RemoveDirectory. Обе функции возвращают булевские значения, указывающие на успешность выполнения операций. Успешность выполнения этих операций зависит, в основном, от разрешений данного пользователя па FTP-сервере на создание, удаление или даже перемещение к отдельному каталогу.

5.3.1.16 Работа с файлами

Функции для размещения и получения файлов с FTP-сервера являются комплексными. Они исключают любую необходимость в управлении файлами со стороны вашего приложения. Потребуется лишь указать FTP-сервер и имя файла на локальном компьютере, и объект CFtpConnection возьмет его оттуда.

Например, для копирования файла с компьютера на FTP-сервер, к которому происходит подключение, используется функция PutFile. Первый параметр, который следует передать функции PutFile, определяет имя локального файла, отправляемого FTP-серверу. Вторым параметром является имя, которое дается файлу, размещаемому на FTP-сервере. Третий параметр указывает режим, в котором будет проводиться передача файла (FTP_TRANSFER_TYPE_BINARY для двоичного файла и FTP_TRANSFER_TYPE_ASCII для текстового ASCII-файла). Четвертым параметром является идентификатор контекста, используемый для отслеживания процесса с помощью объекта ClnternetSession.

Получение файла с FTP-сервера осуществляется с той же легкостью при помощи функции GetFile. Для функции GetFile два первых параметра следуют в обратном порядке, т.е. первый задает имя файла на FTP-сервере, а второй -- имя файла на локальном компьютере. Третьим параметром является булевское значение, указывающее, будет ли производиться запись в случае, если файл уже существует. Четвертым параметром является флаг, определяющий опции создания локального файла. Список этих опций показан в табл. 25. Пятый параметр определяет режим отправки файлов и может принимать те же значения, что и в функции PutFile. Последний, шестой параметр является идентификатором контекста, используемым для идентификации транзакции в функциях отслеживания состояния ClnternetSession.

Таблица 25. Опции GetFile для FTP

Значение

Описание

FILE_ATTRIBUTE_ARCHIVE

Файл будет помечаться как архивный.

FILE_ATTRIBUTE_COMPRESSED

Файл будет сжатым.

FILE_ATTRIBUTE_DIRECTORY

Файл является каталогом.

FILE_ATTRIBUTE_NORMAL

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

FILE_ATTRIBUTE_HIDDEN

Файл скрыт.

FILE_ATTRIBUTE_READONLY

Файл будет присвоен атрибут "только для чтения".

FILE_ATTRIBUTE_SYSTEM

Файл будет использоваться исключительно операционной системой.

FILE_ATTRIBUTE_TEMPORARY

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

Для открытия файла на FTP-сервере для чтения или записи служит функция OpenFile.

Данная функция в первом параметре принимает имя файла на FTP-сервере. Второй параметр определяет режим открытия файла -- только для чтения (GENERIC_READ GENERICJVRITE) или для записи (GENERIC_WRITE), но одновременно о обоих режимах открыть файл нельзя. Третий параметр задает двоичный или ASCII-режим открытия файла и принимает те же значения, что и в GetFile и PutFile. В заключение, четвертый параметр является идентификатором контекста, используемым для отслеживания состояния транзакции. Функция OpenFile возвращает указатель на объект CInternetFile, которым можно воспользоваться для чтения или записи в файл.

Для управления файлами на FTP-сервере существует две функции. Переименованием файла на FTP-сервере занимается функция Rename. Rename принимает два параметра, где первый является текущим именем файла, а второй - именем нового файла. Функция возвращает булевское значение, определяющее успешность выполнения операции. Для удаления файла с FTP-сервера используется функция Remove, принимающая в своем единственном параметре имя файла. Подобно функции Rename, функция Remove возвращает булевское значение, указывающее на успешность выполнения операции.

CFileFind

Класс CFileFind является базовым для CFtpFileFind. Он предоставляет своим потомкам массу функциональных возможностей для перечисления файлов в каталоге Gopher или FTP-сервера и для получения различных атрибутов файлов и каталогов. Объект CFileFind не создается напрямую - вместо этого создаются объекты. CFtpFileFind.

5.3.1.17 Файловые операции

Чтобы начать поиск файлов в определенном каталоге, следует вызвать функцию FindFile. Первым параметром функции FindFile является маска, используемая для отбора файлов при поиске. Если в этом параметре передать NULL, функция FindFile проведет шаблонный поиск (по маске *.*). Второй параметр в настоящий момент не используется и в нем следует передать 0. Чтобы найти все файлы в текущем каталоге на Gopher или FTP-сервере, функция FindFile должна быть вызвана без параметров, поскольку в таком случае вполне подойдут установки по умолчанию.

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

При использовании функций FindFile и FindNextFile для получения имени и других атрибутов текущего файла применяются функции CFileFind . Текущий файл для проверки атрибутов можно получить

только после первого вызова FindNextFile. Функция FindFile начинает поиск, но не позиционирует-его на первый файл.

По завершению поиска всех необходимых файлов следует вызвать метод Close, чтобы иметь возможность запустить еще один поиск с использованием класса CFileFind.

5.3.1.18 Атрибуты файла

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

Таблица 26. Опции FTP GetFile

Функция

Тип значения, возвращаемого функцией

Параметр

Описание

GetLength

DWORD

нет

Возвращает размер файла в байтах.

GetFileName

CString

нет

Возвращает имя файла, включая расширение.

GetFilePath

CString

нет

Возвращает полный маршрут к файлу.

GetFileTitle

CString

нет

Возвращает имя файла без расширения.

GetFileURL

CString

нет

Возвращает URL файла.

GetRoot

CString

нет

Возвращает каталог, в котором был найден файл.

GetCreationTime

BOOL

CTime&

Размещает время создания файла в объекте CTime, передаваемом в первом параметре.

GetLastAccessTime

BOOL

CTime&

Размещает время последнего обращения к файлу в объекте CTime, передаваемом в первом параметре.

GetLastWriteTime

BOOL

CTime&

Размещает время последней записи к файлу в объекте CTime, передаваемом в первом параметре.

IsDots

BOOL

нет

Указывает, что именем файла является . или .., т.е. файл является каталогом.

IsReadOnly

BOOL

нет

Сообщает, является ли данный файл файлом только для чтения.

IsDirectory

BOOL

нет

Сообщает, является ли файл каталогом.

IsCompressed

BOOL

нет

Указывает, является ли файл сжатым.

IsSystem

BOOL

нет

Сообщает, является ли файл системным файлом.

IsHidden

BOOL

нет

Сообщает, является ли файл скрытым.

IsTemporary

BOOL

нет

Указывает, является ли файл временным.

IsNormal

BOOL

нет

Указывает, является ли файл нормальным без параметров.

IsArchived

BOOL

нет

Указывает, является ли файл архивным.

CFtpFileFind

Класс CFtpFileFind используется для поиска файлов по FTP. Создаемся он с помощью указателя на открытый объект CFtpConnection, передаваемый конструктору. Еще одним параметром, который можно передать конструктору CFtpFileFind, является идентификатор контекста, который будет использоваться для отслеживания состояния его операций.

Создав корректный объект CFtpFileFind, можно приступать к поиску файлов, вызывая различные вариации функции FindFile. Функция FindFile класса CFtpFileFind принимает два параметра. Первый параметр задает маску поиска. Если в этом параметре передать NULL, будет производиться поиск всех файлов. Вторым параметром является флаг, позволяющий определить, как именно будет проводиться поиск. Возможные значения этого флага перечислены в табл. 27.

Таблица 27. Опции CFtpFileFind.FindFile

Значение

Описание

INTERNET_FLAG_RELOAD

Получить файл с сервера даже в том случае, если он кэширован локально.

INTERNET_FLAG_DONT_CACHE

He кэшировать файл ни локально, ни на шлюзе.

INTERNET_FLAG_EXISTING_CONNECT

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

INTERNET_FLAG_RAW_DATA Переопределить значения по умолчанию для возврата необработанных данных.

Типичный пример применения класса CFtpFileFind и CFindFile выглядит так:

CFtpConnection* m_fcConnection;

CFtpFileFind fFiles(m_fcConnection);

CString sFileName;

BOOL bMoreFiles;

// Найти первый файл

bMoreFiles = fFiles.FindFile(NULL);

// Продолжать цикл до тех пор, пока не будут найдены все файлы

while (bMoreFiles)

(

// Найти следующий файл

bMoreFiles = fFiles.FindNextFile();

// Получить имя файла

sFileName = fFiles.GetFileName();

//Файл является каталогом?

if (fFiles. IsDirectoryO)

// Пометить его как каталог sFileName += " <DIR>";

// Сделать что-нибудь с файлом

fFiles.Close() ;

5.4. Подсистема работы с файлами

Класс CFile

Класс CFile предназначен для обеспечения работы с файлами. Он позволяет упростить использование файлов, представляя файл как объект, который можно создать, читать, записывать и т.д. Чтобы получить доступ к файлу, сначала надо создать объект класса CFile. Конструктор класса позволяет сразу после создания такого объекта открыть файл. Но можно открыть файл и позднее, воспользовавшись методом Open.

5.4.1.1 Открытие и создание файлов

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

virtual BOOL Open(LPCTSTR lpszFileName,

UINT nOpenFlags,

CFileException* pError=NULL);

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

Второй параметр nOpenFlags определяет действие, выполняемое методом Open с файлом, а также атрибуты файла. Ниже представлены некоторые возможеые значения параметра nOpenFlags:

· CFile::modeCreate - Создается новый файл. Если указанный файл существует, то его содержимое стирается и длина файла устанавливается равной нулю.

· CFile::modeNoTruncate - Этот файл предназначен для использования совместно с файлом CFile::modeCreate. Если создается уже существующий файл, то его содержимое не будет удалено.

· CFile::modeRead - Файл открывается только для чтения.

· CFile::modeReadWrite - Файл открывается для записи и для чтения.

· CFile::modeWrite - Файл открывается только для записи.

· CFile::typeText - Используется классами, порожденными от класса CFile, например CStdioFile, для работы с файлами в текстовом режиме. Текстовый режим обеспечивает преобразование комбинации символа возврата каретки и символа перевода строки.

· CFile::Binary - Используется классами, порожденными от класса CFile, например CStdioFile, для работы с файлами в двоичном режиме.

Необязательный параметр pError, который является указателем на объект класса CFileException, используется только в том случае, если выполнение операции с файлом вызовет ошибку. При этом в объект, указываемый pError, будет записана дополнительная информация.

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

5.4.1.2 Идентификатор открытого файла

В состав класса CFile входит элемент данных m_hFile типа UINT. В нем хранится идентификатор открытого файла. Если объект класса CFile уже создан, но файл еще не открыт, то в переменной m_hFile записана константа hFileNull.

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

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

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

5.4.1.4 Чтение и запись файлов

Для доступа к файлам предназначено несколько методов класса CFile: Read, ReadHuge, Write, WriteHuge, Flush. Методы Read и ReadHuge предназначены для чтения данных из предварительно открытого файла. В 32-разрядных операционных системах оба метода могут одновременно считать из файла больше 65535 байт. Спецификация ReadHuge считается устаревшей и оставлена только для совместимости с 16-разрядными операционными системами.

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

Для записи в файл предназначены методы Write и WriteHuge. В 32-разрядных операционных системах оба метода могут одновременно записывать в файл больше 65535 байт. Методы записывает в открытый файл nCount байт из буфера lpBuf. В случае возникновения ошибки записи, например переполнения диска, методы вызывает обработку исключения.

5.4.1.5 Метод Flush

Когда используется метод Write или WriteHuge для записи данных на диск, они некоторое время могут находиться во временном буфере. Чтобы убедиться, что необходимые изменения внесены в файл на диске, нужно воспользоваться методом Flush.

5.4.1.6 Операции с файлами

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

Для изменения имени файла класс CFile включает статический метод Rename, выполняющий функции этой команды. Метод нельзя использовать для переименования каталогов. В случае возникновения ошибки метод вызывает исключение.

Для удаления файлов в классе CFile включен статический метод Remove, позволяющий удалить указанный файл. Этот метод не позволяет удалять каталоги. Если удалить файл невозможно, то метод вызывает исключение.

Чтобы определить дату и время создания файла, его длину и атрибуты, предназначен статический метод GetStatus. Существует две разновидности метода - первый определен как виртуальный, а второй - как статический метод.

Виртуальная версия метода GetStatus определяет состояние открытого файла, связанного с данным объектом класса CFile. Этот метод вызывается только тогда, когда объект класса CFile создан и файл открыт.

Статическая версия метода GetStatus позволяет определить характеристики файла, не связанного с объектом класса CFile. Чтобы воспользоваться этим методом, необязательно предварительно открывать файл.

5.4.1.7 Блокировка

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

Установить блокировку можно с помощью метода LockRange. Чтобы снять установленные блокировки, надо воспользоваться методом UnlockRange. Если в одном файле установлены несколько блокировок, то каждая из них должна сниматься отдельным вызовом метода UnlockRange.

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

Чтобы переместить указатель текущей позиции файла в новое положение, можно воспользоваться одним из следующих методов класса CFile - Seek, SeekToBegin, SeekToEnd. В состав класса CFile также входят методы, позволяющие установить и изменить длину файла - GetLength, SetLength.

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

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

Чтобы переместить указатель в начало или конец файла, наиболее удобно использовать специальные методы. Метод SeekToBegin перемещает указатель в начало файла, а метод SeekToEnd - в его конец.

Но для определения длины открытого файла совсем необязательно перемещать его указатель. Можно воспользоваться методом GetLength. Этот метод также возвращает длину открытого файла в байтах. Метод SetLength позволяет изменить длину открытого файла. Если при помощи этого метода размер файла увеличивается, то значение последних байт не определено.

Текущую позицию указателя файла можно определить с помощью метода GetPosition. Возвращаемое методом GetPosition 32-разрядное значение определяет смещение указателя от начала файла.

5.4.1.9 Характеристики открытого файла

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

Если требуется определить только имя и расширение открытого файла, можно воспользоваться методом GetFileName. Он возвращает объект класса CString, в котором находится имя файла. В случае, когда нужно узнать только имя открытого файла без расширения, пользуются методом GetFileTitle.

Следующий метод класса CFile позволяет установить путь файла. Это метод не создает, не копирует и не изменяет имени файла, он только заполняет соответствующий элемент данных в объекте класса CFile.

Класс CMemFile

В библиотеку MFC входит класс CMemFile, наследуемый от базового класса CFile. Класс CMemFile представляет файл, размещенный, в оперативной памяти. С объектами класса CMemFile так же, как и с объектами класса CFile. Отличие заключается в том, что файл, связанный с объектом CMemFile, расположен не на диске, а в оперативной памяти компьютера. За счет этого операции с таким файлом происходят значительно быстрее, чем с обычными файлами.

Работая с объектами класса CMemFile, можно использовать практически все методы класса CFile, которые были описаны выше. Можно записывать данные в такой файл или считывать их. Кроме этих методов в состав класса CMemFile включены дополнительные методы.

Для создания объектов класса CMemFile предназначено два различных конструктора. Первый конструктор CMemFile имеет всего один необязательный параметр nGrowBytes: CMemFile(UINT nGrowBytes=1024);

Этот конструктор создает в оперативной памяти пустой файл. После создания файл автоматически открывается (не нужно вызывать метод Open).

Когда начинается запись в такой файл, автоматически выделяется блок памяти. Для получения памяти методы класса CMemFile вызывают стандартные функции malloc, realloc и free. Если выделенного блока памяти недостаточно, его размер увеличивается. Увеличение блока памяти файла происходит по частям по nGrowBytes байт. После удаления объекта класса CMemFile используемая память автоматически возвращается системе.

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


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.