Geek tričko zdarma Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde

FTP výpis souborů ze složky v C# .NET

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V tomto článku si postupně projdeme manipulace se soubory skrze FTP server. Ukážeme si jak získat seznam souborů ze složky, nahrání souboru a také stažení souboru.

Ce je to FTP?

Než začneme, tak by nebylo úplně od věci si zde trochu popsat co to vlastně FTP znamená.

FTP (anglicky File Transfer Protocol) je v informatice protokol pro přenos souborů mezi počítači pomocí počítačové sítě. Využívá protokol TCP z rodiny TCP/IP a může být používán nezávisle na použitém operačním systému (je platformě nezávislý).

Příklad: Vaše firma uspořádala konferenci a tu jste celou natáčeli. Teď ale nastává problém, že se na záznam této konference chce někdo na vzdáleném místě podívat, třeba v Americe. Je několik možností, jak mu tuto nahrávku doručit:

  • Poštou: toto řešení je zdlouhavé a když třeba takovýto video záznam (třeba na CD nebo DVD) budete posílat desítkám nebo stovkám lidí, tak by to bylo neekonomické.
  • E-mailem: tady nastává riziko, že nahrávka bude moc velká => větší než maximální možná velikost přílohy, tak se odeslání nepodaří.
  • Nahrát soubor na internet a ostatní si ho potom stáhnou – k tomuto právě slouží FTP.

Pro dnešní příklad si připravte nějaký FTP účet, se kterým budeme pracovat. FTP prostor vám poskytne webhosting a jak jej získat je vysvětleno např. v lekci Nahrání webu na internet.

Uživatelské rozhraní

Aplikace bude z pohledu uživatelského rozhraní velice strohá, protože v tomto dílu se zaměříme spíše na kód.

Vytvoříme si novou Windows Form aplikaci a z toolboxu si přidáme ListBox. Příklad viz. obrázek níže.

Formulář aplikace

Příprava události

Místo, kde budeme provádět hlavní sekci kódu, si nyní připravíme. K naší události se dostaneme, když v sekci Properties (vlastnosti) klikneme na záložku Events (události) a zde již vidíme všechny možné události. Využijeme událost Load hlavního formuláře. Stačí 2x kliknout do vedlejšího volného pole a událost se vám sama vytvoří a přepne vás to do kódu. Příklad viz. obrázek níže.

Událost load

Jmenné prostory

Při našem kódování budeme potřebovat přidat dva jmenné prostory a to konkrétně:

  • using System.IO;
  • using System.Net;

Jmenné prostory lze samozřejmě automaticky vygenerovat během kódování, takže pokud tento krok přeskočíte, nic závažného se nestane. Dále při programování pokud vám u FtpWebRequest, FtpWebResponse, NetworkCredentials, Stream a nebo StreamReader vyskočí error, tak stačí pouze najet na určitou třídu, následně se vám objeví ikonka a pokud na ni kliknete již se vám ukáže možnost přidat nový using.

Kód

Uri

Jako první krok si vytvoříme novou instanci třídy Uri, do které přes konstruktor uvedeme adresu našeho FTP serveru až po koncovou složku, ze které chceme získat výpis souborů. Pozor, zde se nedá používat třída Path.

  • Konstruktor je typu string
Uri publicUri = new Uri(@"ftp://[email protected]/EnglishWords/Public/");

FtpWebRequest

FtpWebRequest implementuje File Transfer Protocol (FTP) client. My jsi vytvoříme FtpWebRequest s metodou Create, která bere v konstruktoru Uri. Tím jsme si vytvořili požadavek na FTP server, jehož adresu jsme určili skrze Uri.

Dále našemu FtpWebRequestu musíme nastavit 2 další věci. Jako první musíme nastavit vlastnost Credentials. To znamená přístupové údaje k našemu FTP serveru. Tyto údaje vložíme do Credentials skrze třídu NetworkCredential, kde zadáme do konstruktoru dvě string hodnoty (přihlašovací jméno, heslo).

Nyní, když máme nastavený přístup do FTP, zbývá jen určit metodu, čili úkon, který bude náš FtpWebRequest provádět. Vlastnost Method se nastaví za pomocí třídy WebRequestMethods, kde zvolíme třídu Ftp a dále již vidíme výpis úkonů pro Ftp, takže zvolíme ListDirectory. ListDirectory získá výpis všech souborů ze složky, kterou jsme zadali v naší cestě.

WebRequestMet­hods.Ftp

Základní typy metod protokolu Ftp. Je jich trochu více, ale pro naše tutoriály bohatě postačí všechny níže vypsané.

  • DeleteFile
  • DownloadFile
  • UploadFile
  • RemoveDirectory
  • MakeDirectory
  • ListDirectory
FtpWebRequest publicFtp = (FtpWebRequest)FtpWebRequest.Create(publicUri);
publicFtp.Credentials = new NetworkCredential("ucet", "heslo");
publicFtp.Method = WebRequestMethods.Ftp.ListDirectory;

Údaje si samozřejmě nahraďte svým jménem a heslem, které jste dostali od poskytovatele webhostingu. Stejně si upravte i FTP adresu vašeho prostoru.

FtpWebResponse

Zde budeme postupovat podobně jako u FtpWebRequest. Vytvoříme si nový FtpWebResponse, ale při vytváření použijeme náš FtpWebRequest a zvolíme metodu GetResponse. Tímto získáme od FTP serveru odpověď a prakticky dostaneme výpis souborů v dané složce.

FtpWebResponse publicResponse = (FtpWebResponse)publicFtp.GetResponse();

Čtení výpisu a jeho zapsání do komponenty

Nyní když jsem z FTP serveru získali výpis souborů, tak ten výpis musíme nějakým způsobem přečíst a zapsat do naší komponenty.

Ke čtení výpisu použijeme třídu Stream a StreamReader. Vytvoříme si nový Stream a využijeme metody GetResponseStream, kterou disponuje naše odpověď od FTP serveru publicResponse. Teď vytvoříme novou instanci třídy StreamReader a do konstruktoru musíme zadat Stream, takže zadáme náš vytvořený publicStream.

Díky StreamReaderu jsme nyní schopni číst data z našeho výpisu, takže přejdeme k následnému zapsání výpisu do naší komponenty.

Využijeme cyklus while a jako podmínku si zadáme dokud publicStreamReader nedojde na konec streamu (záznamu), tak bude opakovat následujicí akci: Přidat novou položku do naší komponenty ListBox, jako položku budeme užívat publicStreamRe­ader.ReadLine(). Metoda ReadLine nám vrátí string s názvem souboru ve stávajícím řádku. Takto budeme číst řádek po řádku, dokud nenarazíme na konec záznamu a tehdy již neplatí naše podmínka cyklu a program postupuje dál.

Stream publicStream = publicResponse.GetResponseStream();
StreamReader publicStreamReader = new StreamReader(publicStream);

while (!publicStreamReader.EndOfStream)
{
    lsbSeznamSouboru.Items.Add(publicStreamReader.ReadLine());
}

My jsme tímto získali výpis všech souborů ve složce na FTP serveru. Já jen doufám, že se vám tutoriál líbil a těším se příště u dalšího dílu.


 

 

Aktivity (3)

 

 

Komentáře

Avatar
tstepanik
Člen
Avatar
tstepanik:2.9.2013 9:28

A co háčky a čárky prostě Diakritika. Když použiju (ěščřžýáíé) tak vznikají nesmyslné názvy. Co stim.

 
Odpovědět 2.9.2013 9:28
Avatar
Odpovídá na tstepanik
Jakub Lásko[Saarix]:2.9.2013 10:50

A v jaké případě to máš na mysli? U názvu souborů?

Editováno 2.9.2013 10:51
Odpovědět 2.9.2013 10:50
Časem je vše možné.
Avatar
tstepanik
Člen
Avatar
Odpovídá na Jakub Lásko[Saarix]
tstepanik:2.9.2013 11:23

Ano souborů adresářů.

 
Odpovědět 2.9.2013 11:23
Avatar
Jakub Lásko[Saarix]:2.9.2013 11:39

Tak stačí před úvozovky textu napsat @.

Např takto když děláš adresu FTP:

Uri publicUri = new Uri(@"ftp://[email protected]řion.com/ÉnglishWords/Publič/");

Používá se to třeba i když do stringu kopíruješ cestu z disku, aby to nedělalo neplechu.

Editováno 2.9.2013 11:39
Odpovědět 2.9.2013 11:39
Časem je vše možné.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jakub Lásko[Saarix]
David Čápka:2.9.2013 11:45

Měl na mysli že v tom ListBoxu má špatné kódování když má na FTP soubor s českými znaky.

Odpovědět 2.9.2013 11:45
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Jakub Lásko[Saarix]:2.9.2013 11:47

A tak to jsem špatně pochopil :-)

Odpovědět 2.9.2013 11:47
Časem je vše možné.
Avatar
Jakub Lásko[Saarix]:2.9.2013 11:53

Tím si sám nejsem přesně jistý, protože jsem to zatím neřešil. Ale nejspíš by se na text mělo použít třeba utf-8 kódování. Třeba tu někdo jiný má konkrétní zkušenosti s tímto problémem.

Editováno 2.9.2013 11:53
Odpovědět 2.9.2013 11:53
Časem je vše možné.
Avatar
tstepanik
Člen
Avatar
Odpovídá na Jakub Lásko[Saarix]
tstepanik:2.9.2013 13:42

Tak napiš program pro ftp komunikaci a spolehni se na to, že nikdo nepoužije češtinu (ěščřžýáíé).
Už jsem strávil nad tímto problémem nějakou hodinu a pořad nic.

 
Odpovědět 2.9.2013 13:42
Avatar
Jakub Lásko[Saarix]:2.9.2013 14:27

Teoreticky můžeš skrze switch odchytávat (ěščř) a přiřadit jim klasické hodnoty (escr), ale pak tam může být duplicita názvů, ale tu si pohlídám vnitřně a tím bych háčky eliminoval

  • Omlouvám se, měla to být odpověď na tstepanik
Editováno 2.9.2013 14:29
Odpovědět 2.9.2013 14:27
Časem je vše možné.
Avatar
dickulus
Člen
Avatar
dickulus:20.6.2014 16:22

Užitečný článek

Odpovědět 20.6.2014 16:22
Od té doby co zde zavedli ty *píp* body čtu české články jen na zive.cz! Fandím těm, kteří sem dávají články bez bodů!
Avatar
Peter Vestenický:7.2.2017 17:52

Prosím vás vedel by mi niekto poradiť ako by som pri pripájaní na ftp server mohol overiť správne zadaného užívateľa a heslo? bez toho aby mi to padlo?

 
Odpovědět 7.2.2017 17:52
Avatar
Jakub Lásko[Saarix]:7.2.2017 19:37

Dlouho jsem u tohoto článku nebyl, ale teď z patra mě napadá, obalit ten kus kódu try, catch blokem a odchytit si tu vyjímku při špatném heslu.
To jaká vyjímka se vyhodí uvidíš, nebo by to mělo třeba na MSDN v dokumentaci být k dohledání.

Odpovědět 7.2.2017 19:37
Časem je vše možné.
Avatar
Peter Vestenický:7.2.2017 21:39

vďaka za radu

 
Odpovědět 7.2.2017 21:39
Avatar
Patrik Pastor:12. května 1:09

Je tu zdrojak ke stazeni? Protoze jsem udelal vsem co je v clanku a porad mi to vyhazuje chybu, "unable to connect to the remote server", a to jsem i natvdro zkopiroval vse co je to napsane, vcetne uri stringu. Chtel bych videt realny vysledek s listBoxem, tak poprosim autora o zdrojak ke stazeni. Dik

 
Odpovědět 12. května 1:09
Avatar
Patrik Pastor:12. května 1:13

Mam dojem ale ze to neni, ze bych nekde udelal chybu v kodu, spis ze server asi uz neni funkci nebo neexistuje (podle toho ze clanek je 6 let stary), takze jak najdu alternativni server, odkud bych si list souboru mohl pres FTP dostat a nasledne je ulozit do listBoxu? Jak hledat ftp servery?

 
Odpovědět 12. května 1:13
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Patrik Pastor
vajkuba1234:12. května 2:40

To FTP musis mit ty, pripadne na nejakem hostingu a logicky k nemu i pristupove udaje...

Odpovědět  +2 12. května 2:40
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Odpovídá na vajkuba1234
Patrik Pastor:15. května 16:39

Nastesti mi kamarad poradil a vytvoril jsem si ho (z nejake zdarma hostingove firmy, tedy i hosting), ale kdybych ho nemel? ani by mi nikdo neporadil? Kde je tu nekde napsane za ftp potrebuji ja, a ne - nemam to vedet, protoze jedu po lekcich v C# a nikde nebyle dosud ani zminka o ftp. Takze se ptam jakou uroven potom clanek ma, kdyz nerekne takhe zasadni veci

 
Odpovědět  -1 15. května 16:39
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Patrik Pastor
David Čápka:15. května 17:01

ani by mi nikdo neporadil

Kde ti nikdo neporadil? Dostal jsi zadarmo promptní podporu v komentářích. Dále tu máš frekventované diskuzní fórum, kde se můžeš kdykoli na cokoli zeptat. Návod na FTP jsem do článku doplnil.

Odpovědět  +1 15. května 17:01
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Patrik Pastor:15. května 17:03

mozna az ted, ok, ale v dobe kdy jsem to potreboval (cteni clanku, tj. 4 dny zpatky) mi proste aplikace nefungovala, a to i pres to, ze jsem to prachsproste zkopiroval metody odsud (chronologicky podle obsahu). Nakonec jsem musel dat jine ftp, svoje, a to uz fungovalo

 
Odpovědět 15. května 17:03
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Patrik Pastor
David Čápka:15. května 17:07

Jak až teď? Odpověděl ti do 2 hodin. Že ti aplikace nefungovala je naprosto logické, když jsi tam nezadal své připojovací údaje :-` Své FTP tam přeci autor nevystaví, to je jako bys dal někomu platební kartu, aby se s ní naučil platit.

Editováno 15. května 17:07
Odpovědět  +1 15. května 17:07
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Patrik Pastor:15. května 17:10

A jsem u toho, kde je vlastne neco napsane o ftp? Ja jsem to treba ani nevedel ze ftp "je jako nekomu dat platebni kartu". Ano, jak bych to asi vedel mel kdyz se v tomto clanku setkavam s FTP poprve? Proste jsem jen pokracoval, nevim jak to fungovalo. Takze to je o cem mluvim, kdyz rikam, ze nekdy clankum chybi vyvsvetlenoli

 
Odpovědět 15. května 17:10
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Patrik Pastor
David Čápka:15. května 17:13

To máš pravdu, pro nás je tohle hodnotný feedback a do článku jsem to přidal, můžeš se podívat, jsou tam 2 žluté boxíky. Jen říkám, že se tu můžeš vždy zeptat v komentářích nebo ve fóru, člověka co to píše obvykle nenapadne všechno, co může napadnout lidi, co to čtou a není se tomu potřeba tak moc divit.

Odpovědět 15. května 17:13
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Patrik Pastor:15. května 17:15

ok v poho, uz vsemu rozumim. Jenom me to predtim zaskocilo ze mi to vlastne vubec nefungovalo, ikdyz jsem vse mel podle clanku, zjistil jsem, spravil, v poradku. Na forum jsem jeste tady nebyl, hodne veci hledam pres stackoverflow nebo pres zname, tak se tady podivam, jak to tu vypada

 
Odpovědět 15. května 17:15
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Patrik Pastor
vajkuba1234:15. května 17:31

Musis u toho i trochu premyslet, pripadne se zeptej jako clovek a ne, ze tady hned budes brecet a plivat okolo sebe. Priste se na tebe kazdy akorat vykašle.

Editováno 15. května 21:31
Odpovědět  ±0 15. května 17:31
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 24 zpráv z 24.