Práce s FTP (MFC a C++)

Pokud vlastníte nějakou vlastní webovou prezentaci, tak určitě pro aktualizaci stránek nepoužíváte webové rozhraní, ale právě FTP neboli File Transfer Protocol. A jelikož tvorba programu, který bude s FTP serverem komunikovat, není nikterak složitá záležitost, můžeme se rovnou pustit do práce.

Internetové připojení

Ze všeho nejdříve musíme otevřít internetové připojení a získat ukazatel na FTP spojení. V MFC je na podporu FTP hodně tříd, my však začneme třídou CInternetSession , která má členskou funkci GetFTPConnection , která vrací ukazatel na FTP a jejímiž parametry jsou adresa FTP serveru, uživatelské jméno a uživatelské heslo. Pokud funkce selže nebo se nepodaří připojení, tak vyvolá výjimku typu CInternetException , jež nám pomůže identifikovat chyby (viz článek o výjimkách). Musíte si také vložit hlavičkový soubor afxinet.h , ve kterém jsou tyto třídy definovány.

Samotný ukazatel na FTP rozhraní obaluje potom třída CFTPConnection , kterou však musíme deklarovat jako ukazatel na tuto třídu. Otevření připojení tedy už umíme, zbývá pouze na konci programu připojení zase vymazat a to se provede členskou funkcí Close()

Pokud bychom tedy chtěli připojení otevřít a zase zavřít, použijeme tento kód:

#include <afxinet.h>

...

CInternetSession m_IS;
CFTPConnection* m_pFTP;

try
{
  m_pFTP=m_IS.GetFtpConnection("adresa ftp","už. jméno","heslo");
}
catch(CInternetException* ie)
{
  ie->ReportError();
  ie->Delete();
  return;
}

.. //Zde provádíme něco s FTP

//Uzavření spojení
m_pFTP->Close();

Hledání souborů

První věc, kterou bychom měli udělat po připojení, je vypsat uživateli seznam všem souborů a složek, které jsou na serveru. K tomuto účelu slouží třída CFtpFileFind , která ve svém konstruktoru přijímá ukazatel na FTP spojení. Pro první hledání slouží funkce FindFile , které předáte název souboru, který chcete hledat, a dále funkce FindNextFile , která opakuje hledání. Pro zjištění jména souboru potom slouží funkce GetFileName . Zde je tedy kód, který vypíše všechny soubory a složky na serveru:

CFtpFileFind find(m_pFTP);
BOOL next=find.FindFile("*");	//Hledat všechny soubory
if(!next)
{
  find.Close();	//Žádný nebyl nalezen
  return;
}

while(next)
{
  next=find.FindNextFile();	//Projít všechny soubory
  CString filename=find.GetFileName();
  if((filename!=".") && (filename!=".."))	//Toto nejsou soubory
    MessageBox(filename);
}

find.Close();  //Uzavřít hledání

Před zobrazením názvu kontrolujeme, zda se nejedná o názvy . nebo .., protože tyto názvy neoznačují jména souborů, ale aktuální složku a přechod do nadřazené složky.

Nahrávání souborů na FTP

Další věcí, kterou často potřebujeme, je nahrání soubor(ů) na server. K tomu slouží funkce PutFile , která má dva parametry a to název souboru na lokálním počítači a jméno, které bude mít soubor na serveru. Opět zde můžeme zachytit internetovou výjimku, jako v prvním příkladu:

try
{
  m_pFTP->PutFile(localfile,ftpfile);	//Parametry jsou obyčejné CStringy
}
catch(CInternetException* ie)
{
  ie->ReportError();
  ie->Delete();
}

Stažení souboru z FTP

Poslední často prováděnou akcí je stahování souborů na disk. K tomuto účelu slouží funkce GetFile , které předáme jméno souboru na serveru a jméno souboru na lokálním počítači. Zde je ukázka:

try
{
  m_pFTP->GetFile(ftpfile,localfile);	//Typ CString
}
catch(CInternetException* ie)
{
  ie->ReportError();
  ie->Delete();
}

Další funkce

FTP se samozřejmě neomezuje jen na tyto základní funkce, ale nabízí i možnost mazání souboru, přejmenování atd. Zde je popis některých metod třídy CFTPConnection:

BOOL SetCurrentDirectory(LPCTSTR dirname)
Funkce nastaví aktuální složku na FTP serveru.
BOOL GetCurrectDirectory(CString& dirname)
Vrátí název aktuální složky na serveru.
BOOL CreateDirectory(LPCTSTR newdirname)
Vytvoří novou složku na serveru
BOOL RemoveDirectory(LPCTSTR dirname)
Smaže složku i se vším jejím obsahem.
BOOL Rename(LPCTSTR exist,LPCTSTR new)
Funkce přejmenuje soubor na serveru.
BOOL Remove(LPCTSTR filename)
Funkce smaže soubor na serveru.
CInternetFile* OpenFile(LPCTSTR name,DWORD access,DWORD flags,DWORD context)
Funkce otevře soubor na FTP serveru a umožní z něho číst nebo do něj zapisovat bez toho, aby byl zkopírován na lokální počítač. Hodí se nejvíce při stahování velikých souborů, jelikož tak můžeme kontrolovat průběh operace.

Na závěr

Jak vidíte, práce s FTP je opravdu jednoduchá a proto si jistě tyto zbylé funkce dokážete sami zprovoznit. A jelikož na pochopení je vždy nejlepší komplexní příklad, tak na konci tohoto článku si můžete stáhnout aplikaci, která je souhrnem všech výše popisovaných funkcí (samozřejmě i se zdrojovými kódy).

Stáhnout zdrojový kód (26kb)

UPOZORNĚNÍ: Jedná se o archiv článků z let 2003 - 2005, uvedené technologie či postupy již mohou být neaktuální.