Разработка приложений для Internet

       

Процедура загрузки файла с сервера FTP


Чтобы добавить к классу CFtpViewDlg метод FtpFileDownload, воспользуйтесь средствами MFC ClassWizard. В определении класса CFtpViewDlg появится объявление нового метода (листинг 2.10). Соответствующий фрагмент кода мы привели в листинге 3.3. Определение метода FtpFileDownload будет добавлено в файле FtpViewDlg.cpp. Исправьте этот метод так, как это показано в листинге 2.11.

Листинг 2.10. Файл FtpViewDlg.h, фрагмент определения класса CFtpViewDlg

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

// Класс CFtpViewDlg

class CFtpViewDlg : public CDialog

{

. . .

   DECLARE_MESSAGE_MAP()

private:

   BOOL FtpFileDownload( CString sFileName );

};

Метод FtpFileDownload запрашивает у пользователя имя и расположение файла на локальном диске компьютера, в который будет загружен файл с сервера, выбранный из списка в главной диалоговой панели приложения (листинг 2.11). Когда имя файла определено, метод FtpFileDownload выполняет загрузку файла, считывая его непосредственно с сервера FTP.

Листинг 2.11. Файл FtpViewDlg.cpp, метод FtpFileDownload



//============================================================

// Метод FtpFileDownload класса CFtpViewDlg

// Загружает файл с сервера FTP

//============================================================

BOOL CFtpViewDlg::FtpFileDownload( CString sFileName )

{

   BOOL fResult;

   CString sLocalFileName;

   // Определяем объект класса CFileDialog, представляющий

   // стандартную диалоговую панель Save As, в которой

   // по умолчанию выбрано имя файла sFileName

   CFileDialog mFileOpen(FALSE, NULL, sFileName);

   // Отображаем диалоговую панель Open и позволяем

   // пользователю выбрать с помощью нее один файл

   int result = mFileOpen.DoModal();

   // Проверяем как была закрыта диалоговая панель Open -

   // по нажатию кнопки OK или Cancel

   if(result == IDCANCEL)

   {

      // Если пользователь отказался от выбора файла и

      // нажал кнопку Cancel отображаем соответствующее


      // сообщение и возвращаем значение FALSE

      AfxMessageBox("File not selected");

      return FALSE;

   }

   else if(result == IDOK)

   {

      // Если пользователь нажал кнопку OK, определяем

      // имя выбранного файла

      sLocalFileName = mFileOpen.GetPathName();

   }

   sFileName = sCurentDirectory + "/" + sFileName;

   fResult =

     m_FtpConnection ->

        GetFile(sFileName.GetBuffer(MIN_LEN_BUF),

                sLocalFileName.GetBuffer(MIN_LEN_BUF),

                FALSE

        );

   return fResult;

}

Остается только исправить метод OnDblclkFtpList так, чтобы когда пользователь выберет файл из списка в главной диалоговой панели приложения, то выполнялся вызов метода FtpFileDownload класса CFtpViewDlg. На листинге 2.12 мы привели фрагмент файла FtpViewDlg.cpp, который содержит новый вариант метода OnDblclkFtpList.

Листинг 2.12. Файл FtpViewDlg.cpp, метод OnDblclkFtpList

//============================================================

// Метод OnDblclkFtpList класса CFtpViewDlg

// Переходит в выбранный каталог

//============================================================

void CFtpViewDlg::OnDblclkFtpList(NMHDR* pNMHDR,

   LRESULT* pResult)

{

   int       iTotalNumber; // Количество элементов списка

   CString   sSelItem;     // Название каталога

   CString   sLength_Dir;  // Длина файла или строка Dir

   // Блокируем список IDC_FTP_LIST

   m_FtpList.EnableWindow(FALSE);

   // Определяем количество элементов в списке IDC_FTP_LIST

   iTotalNumber = m_FtpList.GetItemCount();

   // Определяем, какой объект списка выбран

   for(int i = 0; i < iTotalNumber; i++)

   {

      // Атрибут LVIS_SELECTED установлен

      // у выбранного элемента списка

      if(LVIS_SELECTED == m_FtpList.GetItemState( i,

         LVIS_SELECTED ))

      {

         // Определяем название выбранного элемента списка

         // (имя файла или каталога)

         sSelItem = m_FtpList.GetItemText( i, 0 );



         // Считываем данные из колонки Length

         sLength_Dir = m_FtpList.GetItemText( i, 1 );

         if(sLength_Dir == "Dir") // Выбран каталог

         {

            // Переходим в выбранный каталог

            sCurentDirectory  =

               sCurentDirectory + "/" + sSelItem;

            // Меняем форму курсора

            CWaitCursor wait;  

            // Отображаем содержимое выбранного каталога

            DirectoryView();

            // Отображаем новый путь каталога

            m_Status.SetWindowText(sCurentDirectory);

         }

         else                     // Выбран файл

         {

            // Меняем форму курсора

            CWaitCursor wait;  

            FtpFileDownload(sSelItem);

         }

         break;

      }

   }

  

   // Снимаем блокировку списка IDC_FTP_LIST

   m_FtpList.EnableWindow(TRUE);

   *pResult = 0;

}

Заново постройте проект и запустите приложение. На экране появится главная диалоговая панель, с помощью которой вы можете соединиться с сервером FTP и просмотреть содержимое его каталогов.

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

На рисунке 2.14 мы показали предложение приложения FtpView сохранить файл с именем readme.txt, расположенный на сервере FTP корпорации Microsoft (адрес ftp.microsoft.com) в каталоге developer, в файле readme.txt на локальном диске компьютера в каталоге Library.



Рис. 2.14. Выбор имени файла на локальном компьютере

По умолчанию в панели Save As вам предлагается имя файла, соответствующее имени исходного файла на сервере FTP. Вы можете оставить его без изменения или поменять по своему усмотрению. Если вы выберите на локальном компьютере уже существующий файл, когда приложение запросит подтверждение на его замену (рис. 2.15).



Рис. 2.15. Файл уже существует

Рассмотрим как работают методы OnDblclkFtpList и FtpFileDownload.


Содержание раздела