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

C# .NET Práce se soubory FTP výpis souborů ze složky v C# .NET

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.

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://4ce@lusorion.com/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;

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 (1)

Článek pro vás napsal Jakub Lásko[Saarix]
Avatar
Věnuji se programování v C#, MonoGame a Unity.

Jak se ti líbí článek?
Celkem (5 hlasů) :
4.44.44.44.4 4.4


 


Miniatura
Všechny články v sekci
Práce se soubory v C#

 

 

Komentáře

Avatar
tstepanik
Člen
Avatar
tstepanik:

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]:

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ět 2.9.2013 11:23
Avatar
Jakub Lásko[Saarix]:

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

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

Uri publicUri = new Uri(@"ftp://4ce@lusoř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:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovědět 2.9.2013 11:47
Časem je vše možné.
Avatar
Jakub Lásko[Saarix]:

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:

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]:

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:

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ů!
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 10 zpráv z 10.