Poznámka: články jsou již mnoho let staré, doba se posunula, mnoho věcí v nich doporučovaných je již dnes překonané - berte s rezervou!


Práce s FTP a ZIP v C#, rychlé publikování archivů

Článek původně vyšel na serveru www.netstudent.cz, ale protože vyhledávače tento server prakticky ignorují, rozhodl jsem se ho uveřejnit také na Trupíkově weBlogu. Pokud se zajímáte o programování v C#, najdete na onom serveru jistě mnoho užitečných článků a návodů.

Předvedu malou utilitku, kterou jsem si napsal pro svoje potřeby. Celkem často uploaduji na nějaký web různé archivy (obvykle zabalené Solution z Visual Studia). Abych si ušetřil cyklus "upravit - přeložit - zabalit - připojit se na FTP - uploadovat" při každé dorbné úpravě, vytvořil jsem si na to prográmek. Takže ukážu jak se v kódu připojit k FTP, uploadovat a také pakovat archivy.

FTP

.NET v namespace System.Net obsahuje třídy, které v pohodě stačí na běžnou práci s FTP (vysokoúrovňovou). Základ je obalen v třídě WebClient, které se nastaví parametry připojení (stačí jméno a heslo). WebClient disponuje metodami UploadFile a DownloadFile, první z nich se bude hodit mě. Cíl se specifikuje jako uri. (Pro nízkoúrovňovější práci s FTP protokolem slouží třída FtpWebRequest)

private WebClient request = new WebClient(); ... request.Credentials = NetworkCredential(username, password); request.UploadFile(uri, filename);

Vytváření archivů

Nejdřív jsem doufal, že v .NET frameworku najdu nějaké šikovné třídy i pro práci s archivy a kompresi. Objevil jsem ale pouze System.IO.Compression, ta ale obsahuje pouze třídy GZipStream a DeflateStream, které nevím jak donutit, aby dělaly to co potřebuji - totiž pakovat celé adresáře.

Takže jsem se rozhodl pro alternativní řešení - proč hledat nějaké .NETové knihovny a nepoužít přímo externí archivátor (v současnosti mám nainstalovaný jen WinRAR, ale pro ostatní archivátory to určitě půjde udělat podobně). WinRAR totiž může být používat skrz příkazy z konzole. Takže pro vytvoření archivu spustím nový proces, předám mu potřebné parametry a nechám ho archív vytvořit.

System.Diagnostics.Process process = new System.Diagnostics.Process(); //cestu k winraru načtu z configuračního souboru process.StartInfo.FileName = System.Configuration.ConfigurationManager.AppSettings["winrar"]; //argumenty specifikcké pro winrar -- pro ostatní archivátory se může syntaxe lišit process.StartInfo.Arguments = String.Format("a {0} {1}", System.IO.Path.GetFileName(output), item); process.Start(); process.WaitForExit();

Za zmínku určitě taky stojí možnost přesměrovat si standartní výstup z WinRARu do okna aplikace (člověk pak může zkontrolvat, jestli se to fakt balí:

process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.UseShellExecute = false; process.Start(); StreamReader r = process.StandardOutput; string line; while (!r.EndOfStream) { line = r.ReadLine(); Console.WriteLine(line); } process.WaitForExit();

Celou solution si můžete stáhnout a podívat se na detaily, link je pod článkem. Používat program je opravdu ušetří hodně práce. Jméno serveru, uživatelské jméno a případně i heslo je možné ukládat do konfiguračního souboru (stejně jako cestu k WinRARu). Také tam lze vložit defaultní cestu pro upload (jde předefinovat optionem -D). Příklad použití:
ftppublish -c -dDownloads Project
zabalí (parametr -c) a uploadne do adresáře Downloads adresář Project.

Aplikace ke stažení i se zdrojákem: (hádejte, jak jsem ho uploadoval)
solution ftppublish

Ohodnoťte prosím užitečnost článku




29
 
49
 
34
 
49
 
8
 
 
Vložit komentář:
 

 



 

 

Nepoužívejte žádné html ani texy značky, odřádkování se zachová. Pokud uvádíte zdrojový kód, můžete ho vložit mezi značky
<syntax jazyk="PHP">...</syntax>,
bude potom zformátován. Jako atribut můžete uvést PHP, C#, HTML, CSS a mnoho dalších.


opiste cislo Opište číslo:

 

6. 6. 2007 19:16:22
[1] (DJF (fishthedj(at)seznam.cz))
Poděkování odpovědět
Ahoj, již delší dobu hledám nějaký jednoduchý návod, jak uploadovat a downloadovat soubory přes FTP. Tvůj prográmek sice nevyužiju, ale konečně jsi mi ukázal, že třídu WebClient lze použít i pro uploadování souborů na FTP server, o čemž sem si dříve myslel že to nelze. Fakt Díky ;-)
16. 11. 2007 13:05:35
[2] (Lopy)
n1 odpovědět
shrnu slovy:BOREC
16. 11. 2007 14:17:32
[3] (Anonymous)
dotaz  odpovědět
V C# jsem začátetčík, a tak mi není jasný jak bych měl naplnit vstupní bod. Jak jsem koukal do kodu tak tam je argument Mainu je využíván jako zdroj pro uploadované soubory. Nemám ponětí jak bych ho naplnil. Díky za odpověd:)
16. 11. 2007 15:48:40
[4] (Trupík (jakub.maly(at)atlas.cz)) www
Re: dotaz  odpovědět
[3]: parametry příkazové řádky, když do příkazové řádky napíšete ftppublish.exe arg1 arg2 tak právě tyto řetězce dostanete v programu v poli args[].

Také lze na exe soubor přetáhnout jiný soubor metodou drag-and-drop a tento soubor bude také předán jako parametr (ve windows možná běžnější způsob).

Pokud se vám zdá zadávání parametrů v příkazová řádce nepohodlné, můžete si doplnit k programu nějaké GUI. Šikovný může být také dávkový .bat soubor.
16. 11. 2007 16:12:36
[5] (Anonymous)
Re: Re: dotaz  odpovědět
[4] Děkuji mnohokrát
16. 11. 2007 22:16:45
[6] (Anonymous)
Re: Re: dotaz  odpovědět
[4] Ještě se zeptám. Píše mi to file unvailable(eg.file not found, no acces). Nevim co dělám špatně. Argumenty dávám -d C:\soub.exe. Můžu poprosit ještě o radu. Překonfiguroval jsem si nastavení na vlastní server...Zkouknul jsem jakžtak zddroj, ale přesto mi to nefuguje.
17. 11. 2007 11:27:07
[7] (Anonymous)
Ok odpovědět
Dobrý už mi to jde. Ale stejnak tam furt nějaké nesrovnalosti jsou...Když si to předělávám do své vlastní podoby, a potřebuju aby se mi uploadoval soubor z nějakého adresáře(pevně dáno) , takže nikam nezadávám tam jsem ztratil ponětí kam napsat jméno adresáře odkad se má uploadovat. Páč ty si tam nikde nepředáváš jméno adresáře okad se má kopírovat.
17. 11. 2007 14:41:03
[8] (Trupik (jakub.maly(at)atlas.cz)) www
Re: Ok odpovědět
[7] řádkadka 66: arguments.item = args[p]. Když tady před to přidaš jméno adresáře (třeba "directory/" + args[p]) tak by to mělo stačit, ne?
12. 3. 2008 18:38:43
[9] (Marek (mmarklin(at)seznam.cz))
FTP přes pasivní mod odpovědět
Ahoj
potřebuji do školy programovat aplikaci, která uploaduje souboru na ftp - ale vždy mně příkaz uploadFile vrátí chybu:

The remote server returned an error: (550) File unavailable (e.g., file not found, no access).

Soubor který tam chci nahrat existuje a cesta je správná, i název servru. Už nevím čím tom může být.
Na servr se normálně připojím.
Připojit se lze pouze přes pasivní mod. Může tu chybu dělat právě ten pasivní mod?

Diky za pomoc.


24. 6. 2008 17:21:51
[10] (joshis (joshis(at)centrum.cz)) www
Diky - presne to je to, co jsem hledal... odpovědět
... a to jsem dokonce zadal vyhledavaci vyraz v anglictine... a presto na Google prvni stranka...

Ted to jen spojim se secret-sharing a uploadem na vice FTP serveru a bude to:o)... hehe...
24. 6. 2008 19:10:11
[11] (joshis (joshis(at)centrum.cz)) www
Chybka? odpovědět
Myslim, ze ti tam vypadlo "new" (jasne ze to kazdej pochopi...):

request.Credentials = *new* NetworkCredential(username, password);