using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace JWH.NETWORK { public class FtpClient { #region [ Properties ] ------------------------------------------------ public string URI { get; set; } public string UID { get; set; } public string PWD { get; set; } #endregion #region [ FtpClient ] ------------------------------------------------- public FtpClient() { } public FtpClient(string uri, string uid, string pwd) { this.URI = uri; this.UID = uid; this.PWD = pwd; } #endregion #region [ Method ] ---------------------------------------------------- private FtpWebRequest GetFtpWebRequest(string path) { try { FtpWebRequest ftpRequest = WebRequest.Create(path) as FtpWebRequest; ftpRequest.Timeout = 3000; if (string.IsNullOrEmpty(this.UID)) ftpRequest.Credentials = new NetworkCredential(); else ftpRequest.Credentials = new NetworkCredential(this.UID, this.PWD); return ftpRequest; } catch (Exception ex) { throw ex; } } public string[] GetList(string path = "") { StreamReader reader = null; try { List lstFile = new List(); string fullPath = $"{this.URI}{path}"; FtpWebRequest ftpRequest = this.GetFtpWebRequest(fullPath); //ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails; WebResponse response = ftpRequest.GetResponse(); reader = new StreamReader(response.GetResponseStream()); string fileInfo = reader.ReadLine(); while (string.IsNullOrEmpty(fileInfo) == false) { object obj = this.CreateFtpObject(fileInfo); lstFile.Add(fileInfo); fileInfo = reader.ReadLine(); } return lstFile.ToArray(); } catch (Exception ex) { throw ex; } finally { if (reader != null) reader.Close(); } } public FtpObject[] GetFtpObjects(string path = "") { StreamReader reader = null; string fullPath = $"{this.URI}{path}"; try { List lstObject = new List(); FtpWebRequest ftpRequest = this.GetFtpWebRequest(fullPath); //ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails; WebResponse response = ftpRequest.GetResponse(); reader = new StreamReader(response.GetResponseStream()); string fileInfo = reader.ReadLine(); while (string.IsNullOrEmpty(fileInfo) == false) { FtpObject obj = this.CreateFtpObject(fileInfo); lstObject.Add(obj); fileInfo = reader.ReadLine(); } return lstObject.ToArray(); } catch (Exception ex) { throw ex; } finally { if (reader != null) reader.Close(); } } public bool Download(string path, string localpath) { FileStream writer = null; Stream reader = null; try { string fullPath = $"{this.URI}{path}"; FtpWebRequest ftpRequest = this.GetFtpWebRequest(fullPath); ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile; WebResponse response = ftpRequest.GetResponse(); reader = response.GetResponseStream(); if (System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(localpath)) == false) System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(localpath)); writer = new FileStream(localpath, FileMode.Create, FileAccess.Write); byte[] byteBuffer = new byte[1024]; int byteSize = reader.Read(byteBuffer, 0, byteBuffer.Length); while (byteSize > 0) { writer.Write(byteBuffer, 0, byteSize); byteSize = reader.Read(byteBuffer, 0, byteBuffer.Length); } return true; } catch (Exception ex) { XLogger.Instance.Error($"{this.URI}{path} --> {localpath}"); throw ex; } finally { if (writer != null) writer.Close(); if (reader != null) reader.Close(); } } #endregion public FtpObject CreateFtpObject(string value) { try { string strDateTime = value.Substring(0, 17).Trim(); string strType = value.Substring(18, 11).Trim(); string strLength = value.Substring(30, 8).Trim(); string strName = value.Substring(39).Trim(); DateTime dtCreate = DateTime.MinValue; DateTime.TryParse(strDateTime, out dtCreate); long nLength = 0; long.TryParse(strLength, out nLength); FtpObject result = null; if (string.Compare(strType, "", true) == 0) { FtpDirectory ftpDirectory = new FtpDirectory(); ftpDirectory.Name = strName; ftpDirectory.CreateDateTime = dtCreate; result = ftpDirectory; } else { FtpFile ftpFile = new FtpFile(); ftpFile.Name = strName; ftpFile.Length = nLength; ftpFile.CreateDateTime = dtCreate; result = ftpFile; } return result; } catch (Exception ex) { throw ex; } } } public class FtpObject { public string Name { get; set; } = string.Empty; public string Path { get; set; } = string.Empty; public string FullName { get { return $"{this.Path}/{this.Name}"; } } public DateTime CreateDateTime { get; set; } = DateTime.MinValue; public TreeNode GetTreeNode() { TreeNode node = null; node = new TreeNode(this.Name, 0, 0); node.Tag = this; if (this.GetType() == typeof(FtpDirectory)) { node.ImageIndex = 1; FtpDirectory ftpDirectory = this as FtpDirectory; foreach(FtpObject obj in ftpDirectory.Childs ) { node.Nodes.Add(obj.GetTreeNode()); } } return node; } public void Refresh(FtpClient ftpClient, int depth = 0) { try { } catch (Exception ex) { throw ex; } } } public class FtpDirectory : FtpObject { public List Childs { get; set; } = new List(); public FtpObject[] GetChilds(FtpClient ftpClient, int depth = 0) { try { List lstChild = new List(); if (depth < 0) return lstChild.ToArray(); foreach (FtpObject obj in ftpClient.GetFtpObjects(this.FullName)) { obj.Path = this.FullName; lstChild.Add(obj); FtpDirectory ftpDirectory = obj as FtpDirectory; if (ftpDirectory != null && depth > 0) ftpDirectory.Childs.AddRange(this.GetChilds(ftpClient, depth - 1)); } this.Childs.Clear(); this.Childs.AddRange(lstChild.ToArray()); return this.Childs.ToArray(); } catch (Exception ex) { throw ex; } } } public class FtpFile : FtpObject { public long Length { get; set; } = 0; public FtpFile() { } public FtpFile(string name, long length) { this.Name = name; this.Length = length; } } }