Práce s FTP a ZIP v C#, rychlé publikování archivů
- Vložil Trupík 1/16/2007 6:27:16 PM
-
Č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