V prvok kroku musíme stiahnuť zoznam súborov v nami zadanom adresári na ftp. Na to použijeme nasledujúci kód:
FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServer + "/"+directory)); reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.Method = WebRequestMethods.Ftp.ListDirectory; reqFTP.Proxy = null; reqFTP.KeepAlive = false; using (FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse()) { using (StreamReader reader = new StreamReader(response.GetResponseStream())) { name = reader.ReadToEnd(); } }
Ak nastavíme reqFTP.Method = WebRequestMethods.Ftp.ListDirectory; ,tak sa nám stiahne zoznam súborov v tvare:
a beeeee config.xml Copy (2) of config.xml
Z tohto tvaru však nevieme určiť či sa jedná o adresár alebo súbor. Ak to chceme rozlíšiť, musíme nastaviť reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;. Pomocou tejto metódy sa stiahne zoznam súborov v tvare:
drwxr-xr-x 1 ftp ftp 0 Jun 20 11:38 a drwxr-xr-x 1 ftp ftp 0 Jun 20 13:28 beeeee -rw-r--r-- 1 ftp ftp 690 Oct 08 2009 config.xml -rw-r--r-- 1 ftp ftp 690 Oct 08 2009 Copy (2) of config.xml
Z nasledujúceho vidíme, že ak je to adresár, riadok sa začína "d". Z tohto postupu je však dosť naročné vyseparovať názov súboru. Preto názvy súborov použijeme z prvého kroku a to, či sa jedná o adresár, z druhého kroku. Možno existuje aj iné riešenie, ale ja som to riešil takto.
Vysledný zdrojový kód v c# :
using System; using System.Collections; using System.IO; using System.Net; using System.Text; namespace projectik { /// <summary> /// ftpFName /// </summary> internal class ftpFName { public ftpFName(string name, bool isFolder) { this.name = name; this.isFolder = isFolder; } public bool isFolder { get; set; } public string name { get; set; } } /// <summary> /// FtpClass /// </summary> internal class FtpClass { private string ftpServerIP { get; set; } private string ftpUserID { get; set; } private string ftpPassword { get; set; } private string errorMessage = String.Empty; private ArrayList downloadedFiles = new ArrayList(); /// <summary> /// konstruktor FTPClass /// </summary> /// <param name="ftpServerIP"></param> /// <param name="ftpUserID"></param> /// <param name="ftpPassword"></param> public FtpClass(string ftpServerIP, string ftpUserID, string ftpPassword) { try { this.ftpServerIP = ftpServerIP; this.ftpUserID = ftpUserID; this.ftpPassword = ftpPassword; } catch { } } /// <summary> /// Vlastnost na vratenie stiahnutych suborov z FTP /// </summary> public string[] DownloadedFiles { get { return (string[])downloadedFiles.ToArray(typeof(string)); } } /// <summary> /// Vrati aktualnu chybu /// </summary> /// <returns></returns> public string GetErrorMessage() { return errorMessage; } /// <summary> /// Metoda na stiahnutie vsetkych suborov a adresarov na ftp /// </summary> /// <param name="directory">adresar na ftp</param> /// <param name="destiny">ka sa to ma ulozit</param> /// <returns>true/false</returns> public bool downloadDirectory(string directory, string destiny) { try { string path = Path.Combine(destiny, directory); bool status = false; //ak adresar neexistuje ,tak ho vytvorim if (Directory.Exists(path) != true) { Directory.CreateDirectory(path); } directory = directory.TrimEnd(new char[] { '\\', '/' }) + "/"; //ziskanie vsetkych suborov v adresary na ftp ftpFName[] subory = this.getFileList(directory); foreach (ftpFName s1 in subory) { if (s1.isFolder) { status = this.downloadDirectory(directory + s1.name + "/", destiny); if (status != true) { return false; } continue; } status = this.downloadFile(directory + s1.name, path); if (status != true) { return false; } } } catch (Exception ex1) { this.errorMessage = ex1.Message; return false; } return true; } /// <summary> /// ziskanie vsetkych suborov v adresary na ftp /// </summary> /// <param name="directory"></param> /// <returns>true/false</returns> private ftpFName[] getFileList(string directory) { ArrayList fileAndFolder = new ArrayList(); StringBuilder result = new StringBuilder(); string name, detailsname; string[] nameFiles, detailsNameFiles; try { FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + directory)); reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.Method = WebRequestMethods.Ftp.ListDirectory; reqFTP.Proxy = null; reqFTP.KeepAlive = false; reqFTP.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse()) { using (StreamReader reader = new StreamReader(response.GetResponseStream())) { name = reader.ReadToEnd(); } } nameFiles = name.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + directory)); reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails; reqFTP.Proxy = null; reqFTP.KeepAlive = false; reqFTP.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse()) { using (StreamReader reader = new StreamReader(response.GetResponseStream())) { detailsname = reader.ReadToEnd(); } } detailsNameFiles = detailsname.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < detailsNameFiles.Length; i++) { fileAndFolder.Add(new ftpFName(nameFiles[i], detailsNameFiles[i].StartsWith("d"))); } return (ftpFName[])fileAndFolder.ToArray(typeof(ftpFName)); } catch (Exception ex1) { this.errorMessage = ex1.Message; return null; } } /// <summary> /// Stiahnutie jedneho suboru z ftp /// </summary> /// <param name="file">subor na stiahnutie</param> /// <param name="destiny">Kam ulozit subor</param> /// <returns></returns> private bool downloadFile(string file, string destiny) { try { FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + file)); reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; reqFTP.Proxy = null; reqFTP.KeepAlive = false; reqFTP.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { using (FileStream writeStream = new FileStream(Path.Combine(destiny, Path.GetFileName(file)), FileMode.Create)) { int Length = 2048; Byte[] buffer = new Byte[Length]; int bytesRead = responseStream.Read(buffer, 0, Length); while (bytesRead > 0) { writeStream.Write(buffer, 0, bytesRead); bytesRead = responseStream.Read(buffer, 0, Length); } //ulozim subor ,ktory bol vytvorený this.downloadedFiles.Add(Path.GetFileName(file)); } } } } catch (Exception ex1) { this.errorMessage = ex1.Message; return false; } return true; } } }
Použitie :
string ftpUserID = "root"; string ftpPassword = "admin"; string destinyLocalDirectory = @"c:\daco"; FtpClass myFtpClass = new FtpClass(server, ftpUserID, ftpPassword); string dir = "ftpDirectory"; bool status = myFtpClass.downloadDirectory(dir, destinyLocalDirectory); if (status != true) { errorMessage = "Nepodarilo sa stiahnut vsetky data s ftp servera.\n"+myFtpClass.GetErrorMessage(); return false; }