Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual2.doc
Скачиваний:
5
Добавлен:
07.03.2016
Размер:
3.31 Mб
Скачать

11.4. Використання протоколу ftp

У наступній програмі розглядається приклад роботи з протоколом FTP. Приклад знаходиться у папці DISK\Internet\ftp. Він призначений для пересилки файлів в Інтернет. Завантажимо файл з FTP-сайту Microsoft, який має назву index.txt. У ньому міститься повідомлення Microsoft про те, що файли на FTP-сайті надаються «як є», без жодних гарантій. Ми завантажимо цей файл у новому додатку.

У нашій програмі є кнопка з написом Отримати файл і текстове поле.

Коли користувач натискає кнопку і починає завантаження файлу на диск, в текстовому полі з'являється напис «Іде пересилання файлу ...».

За допомогою AppWizard створіть програму на базі діалогового вікна і дайте їй ім'я FTP. Потім розмістіть в головному діалоговому вікні кнопку з написом Отримати файл і текстове поле. Зв'яжіть з вмістом текстового поля змінну m_text та створіть обробник OnButton1() для кнопки. Далі необхідно підключитися до Інтернету.

Підключення до Інтернету через FTP

Перш за все ми створимо в методі OnButton1() вказівку на сеанс інтернету pInternetSession, як це було зроблено в попередньому прикладі (як і раніше, додаєте рядок #include <afxinet.h> для роботи з інтернет-компонентами):

void CFTPDlg::OnButton1()

{

CInternetSession* pInternetSession;

pInternetSession = new CInternetSession();

if (!pInternetSession)

{

AfxMessageBox("He удалось начать сеанс Internet",

MB_OK);

return;

}

}

Потім ми створюємо pFTPConnection – вказівку на об'єкт класу CFtpConnection, призначеного для роботи з FTP в програмах на Visual C++. Щоб створити цей об'єкт, ми викликаємо метод GetFtpConnection() класу CInternetSession, який встановлює анонімне FTP-підключення до вузла Microsoft. Як параметр методу передається ім'я FTP-вузла, до якого необхідно підключитися, – в даному випадку ftp.microsoft.com:

void CFTPDlg::OnButton1()

{

CInternetSession* pInternetSession;

CFtpConnection* pFTPConnection;

pInternetSession = new CInternetSession();

if (!pInternetSession)

{

AfxMessageBox("He удалось начать сеанс Internet",

MB_OK);

return;

}

pFTPConnection = pInternetSession->

GetFtpConnection(CString("ftp.microsoft.com"));

.............................................................

}

Клас CFtpConnection дозволяє виконувати стандартні для протоколу FTP дії – отримувати, відправляти, видаляти файли і т. д. Його методи перераховані в табл. 11.3.

Таблиця 11.3

Методи класу CFtpConnection

Метод

Призначення

CFtpConnection

Створює об'єкт класу CFtpConnection

Close

Закриває підключення до сервера

СreateDirectory

Створює каталог на сервері

GetCurrentDirectory

Отримує поточний каталог для підключення

GetCurrentDirectoryAsURL

Отримує поточний каталог для підключення у вигляді URL

GetFile

Отримує файл з сервера

OpenFile

Відкриває файл на сервері

PutFile

Поміщає файл на сервер

Remove

Видаляє файл з сервера

RemoveDirectory

Видаляє заданий каталог з сервера

Rename

Перейменовує файл на сервері

SetCurrentDirectory

Задає поточний каталог для FTP

Підказка. Якщо ви не можете або не хочете обмежуватися анонімним підключенням, у методі GetFtpConnection() можна задати ім'я користувача та пароль.

Якщо спроба встановлення зв'язку з FTP-вузлом виявилася невдалою, слід вивести повідомлення про помилку і завершити роботу програми:

void CFTPDlg::OnButton1()

{

CInternetSession* pInternetSession;

CFtpConnection* pFTPConnection;

pInternetSession = new CInternetSession();

if (!pInternetSession)

{

AfxMessageBox("He удалось начать сеанс Internet",

MB_OK);

return;

}

pFTPConnection = pInternetSession->

GetFtpConnection(CString("ftp.microsoft, com"));

if(!pFTPConnection){

AfxMessageBox("He удалось установить FTP-подключение", MB_OK);

return;

}

.............................................................

}

В іншому випадку ми повідомляємо про початок процесу завантаження, поміщаючи в текстове поле повідомлення «Йде пересилання файлу...»:

void CFTPDlg::OnButton1()

{

CInternetSession* pInternetSession;

CFtpConnection* pFTPConnection;

pInternetSession = new CInternetSession();

if (!pInternetSession)

{

AfxMessageBox("He удалось начать сеанс Internet",

MB_OK);

return;

}

pFTPConnection = pInternetSession->

GetFtpConnection(CString("ftp.microsoft.com"));

if(!pFTPConnection){

AfxMessageBox("He удалось установить FTP-подключение", MB_OK);

return;

}

else{

m_text = "Идет пересылка файла...";

UpdateData(false);

}

.............................................................

}

Отримати файл дуже просто – достатньо викликати метод GetFile() класу CFtpConnection:

void CFTPDlg::OnButton1()

{

CInternetSession* pInternetSession;

.............................................................

pFTPConnection->GetFile(CString("Softlib\\index.txt"),

CString("index.txt"));

pFTPConnection->Close();

pInternetSession->Close();

}

Зверніть увагу: в кінці методу OnButton1() ми закриваємо FTP-підключення і завершуємо сеанс Інтернету. Програма готова – запустіть її і отримаєте файл index.txt, натиснувши кнопку Отримати файл.

Після встановлення FTP-підключення програма виводить повідомлення «Йде пересилання файлу ...» (рис. 11.6) і поміщає файл index.txt в каталог проекту FTP.

Рис. 11.6. Отримання файлу через протокол FTP

Оригінальний текст програми міститься у файлах FTPDlg.h / FTPDlg.cpp.

FTPDlg.h і FTPDlg.cpp

// FTPDlg.h : заголовочний файл

//

#if !defined(AFX_FTPDLG_H__F4238327_9410_11D0_8860_444553540000__INCLUDED_)

#define AFX_FTPDLG_H__F4238327_9410_11D0_8860_444553540000__INCLUDED_

#if _MSC_VER >= 1000

#pragma once

#endif // _MSC_VER >= 1000

/////////////////////////////////////////////////////////////////////////

// Діалогове вікно CFTPDlg

class CFTPDlg : public CDialog

{

// Конструювання

public:

CFTPDlg(CWnd* pParent = NULL);

// Стандартний конструктор

// Дані діалогового вікна

//{{AFX_DATA(CFTPDlg)

enum { IDD = IDD_FTP_DIAL0G };

CString m_text;

//}}AFX_DATA

// Перевантаження

// Перевантажені віртуальні функції,

// сформовані ClassWizard-ом.

//{{AFX_VIRTUAL(CFTPDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX);

// Підтримка DDX/DDV

//}}AFX_VIRTUAL

// Реалізація

protected:

HICON m_hIcon;

// Сформовані функції карти повідомлень

//{{AFX_MSG(CFTPDlg)

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

afx_msg void OnButton1();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ буде вставляти додаткові

// оголошення перед попереднім рядком.

#endif //

!defined(AFX_FTPDLG_H__F4238327_9410_11D0_8860_444553540000__INCLUDED_)

// FTPDlg.cpp : файл реалізації

//

#include "stdafx.h"

#include "FTP.h"

#include "FTPDlg.h"

#include <afxinet.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////

// Діалогове вікно CAboutDlg, що виводиться по команді About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Данні діалогового вікна

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// Перевантаження

// Перевантажені віртуальні функції,

// сформовані ClassWizard-ом.

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX);

// Підтримка DDX/DDV

//}}AFX_VIRTUAL

// Реалізація

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// Обробники повідомлень відсутні

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////

// Діалогове вікно CFTPDlg

CFTPDlg::CFTPDlg(CWnd* pParent /*=NULL*/)

: CDialog(CFTPDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CFTPDlg)

m_text = _T("");

//}}AFX_DATA_INIT

// Зверніть увагу на те, що в Win32 LoadIcon

// не вимагає подальшого виклику DestroyIcon

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CFTPDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CFTPDlg)

DDX_Text(pDX, IDC_EDIT1, m.text);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CFTPDlg, CDialog)

//{{AFX_MSG_MAP(CFTPDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////

// Обробники повідомлень CFTPDlg

BOOL CFTPDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Додати команду "About..." у системне меню.

// Значення IDM_ABOUTBOX повинно знаходитись в діапазоні

// системних команд.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (IstrAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,

IDM_ABOUTBOX, strAboutMenu);

}

}

// Поставити значок для діалогового вікна. Бібліотека

// робить це автоматично, якщо головне вікно програми

// не є діалоговим.

SetIcon(m_hIcon, TRUE); // Встановити великий значок

SetIcon(m_hIcon, FALSE); // Встановити малий значок

// ЗРОБИТИ: додайте додаткову ініціалізацію

return TRUE; // повернути TRUE, якщо тільки ви

// не передаєте фокус елементу

}

void CFTPDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// Якщо в діалоговому вікні є кнопка згортання, наведений

// нижче код знадобиться для малювання значка. У додатках MFC,

// які використовують модель документ / вид, це робиться

// автоматично.

void CFTPDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // контекст пристрою для

// малювання

SendMessage(WM_ICONERASEBKGND,

(WPARAM) dc.GetSafeHdc(), 0);

// Вивести значок в центрі клієнтського

// прямоугольника

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Намалювати значок

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

// Викликається системою для отримання вказівки,

// відображаємого при перетаскуванні згорнутого вікна.

HCURSOR CFTPDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CFTPDlg::OnButton1()

{

CInternetSession* pInternetSession;

CFtpConnection* pFTPConnection;

pInternetSession = new CInternetSession();

if (!pInternetSession)

{

AfxMessageBox("He удалось начать сеанс Internet",

MB_OK);

return;

}

pFTPConnection = pInternetSession->

GetFtpConnection(CString("ftp.microsoft.com"));

if(!pFTPConnection){

AfxMessageBox(

"He удалось установить FTP-подключение",

MB_OK);

return;

}

else{

m_text = "Идет пересылка файла...";

UpdateData(false);

}

pFTPConnection->GetFile(CString("Softlib\\index.txt"),

CString("index.txt"));

pFTPConnection->Close();

pInternetSession->Close();

}

У цьому розділі ми познайомилися з деякими можливостями Visual C++, які помітно спрощують програмування для Інтернету.

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