class DirectoryItem { public Uri BaseUri; public string AbsolutePath { get { return string.Format("{0}/{1}", BaseUri, Name); } } public DateTime DateCreated; public bool IsDirectory; public string Name; public List<DirectoryItem> Items; public override string ToString() { return Name; } } internal enum enumFolderListFMT { UNIX, DOS_IIS }; internal enum enumFTPPlatform { WindowsServer2008, ServU} /// <summary> /// 获取目录信息(包含文件夹,文件) /// </summary> /// <param name="address"></param> /// <param name="username"></param> /// <param name="password"></param> /// <returns></returns> static List<DirectoryItem> GetDirectoryInformation(string addr2, string username, string password) { var address = addr2.EndsWith("/") ? addr2.Substring(0, addr2.Length - 1) : addr2;//去除最后一个斜杠 FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(address); request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; request.Credentials = new NetworkCredential(username, password); request.UsePassive = true; request.UseBinary = true; request.KeepAlive = false; string[] list = null; using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) using (StreamReader reader = new StreamReader(response.GetResponseStream())) { list = reader.ReadToEnd().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); } //unix or dos_iis format? enumFolderListFMT folderFormat = enumFolderListFMT.UNIX; int dir_pos = 0; bool found = false; foreach (var item in list) { if (item.ToLower().Contains("<dir>")) { folderFormat = enumFolderListFMT.DOS_IIS; dir_pos = item.ToLower().IndexOf("<dir>"); found = true; break; } } if (!found && list.Length > 0 && list[0].ToLower()[0] != 'd' && list[0].ToLower()[0] != '-') { folderFormat = enumFolderListFMT.DOS_IIS; } enumFTPPlatform ftpPlatform = enumFTPPlatform.WindowsServer2008; if (folderFormat == enumFolderListFMT.UNIX) { if (list.Length > 0 && list[0].Substring(0, 10).ToLower().Count(c => c == '-') < 3) ftpPlatform = enumFTPPlatform.WindowsServer2008; else ftpPlatform = enumFTPPlatform.ServU; } List<DirectoryItem> returnValue = new List<DirectoryItem>(); if (folderFormat == enumFolderListFMT.DOS_IIS) { foreach (var item in list) { if (item.ToLower().Contains("<dir>")) { var dir = item.Substring(dir_pos + 5).Trim(); if (dir == "." || dir == "..") continue; var di = new DirectoryItem(); di.BaseUri = new Uri(address); //di.DateCreated = dateTime; di.IsDirectory = true; di.Name = dir; //Debug.WriteLine(di.AbsolutePath); di.Items = GetDirectoryInformation(di.AbsolutePath, username, password); returnValue.Add(di); } else { string filename = ""; if(found) filename = item.Substring(dir_pos + 14).Trim(); else filename = item.Substring(39).Trim(); var di = new DirectoryItem(); di.BaseUri = new Uri(address); di.IsDirectory = false; di.Name = filename; di.Items = null; returnValue.Add(di); } } } else if (folderFormat == enumFolderListFMT.UNIX) { var pos = ftpPlatform == enumFTPPlatform.WindowsServer2008 ? 58 : 54; foreach (var item in list) { if (item.Substring(0, 1).ToLower() == "d") { var dir = item.Substring(pos).Trim(); if (dir == "." || dir == "..") continue; var di = new DirectoryItem(); di.BaseUri = new Uri(address); di.IsDirectory = true; di.Name = dir; di.Items = GetDirectoryInformation(di.AbsolutePath, username, password); returnValue.Add(di); } else if (item.Substring(0, 1).ToLower() == "-") { var filename = item.Substring(pos).Trim(); var di = new DirectoryItem(); di.BaseUri = new Uri(address); di.IsDirectory = false; di.Name = filename; di.Items = null; returnValue.Add(di); } } } return returnValue; } /// <summary> /// 下载文件 /// </summary> /// <param name="filePath">下载到哪里</param> /// <param name="outputFilename">下载后的文件名</param> /// <param name="fileName">服务器上的文件名</param> /// <param name="ftpServerIP">服务器全路径,注意最后的斜线不可少。如ftp://172.18.1.152:8009/aaa/</param> /// <param name="ftpUserID">访问的用户名</param> /// <param name="ftpPassword">访问的密码</param> /// <returns></returns> public int DownloadFile(string filePath, string outputFilename, string fileName, string ftpServerIP, string ftpUserID, string ftpPassword) { FtpWebRequest reqFTP; try { //filePath = < <The full path where the file is to be created.>>, //fileName = < <Name of the file to be created(Need not be the name of the file on FTP server).>> FileStream outputStream = new FileStream(filePath + "\" + outputFilename, FileMode.Create); reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpServerIP + fileName)); reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; reqFTP.UseBinary = true; reqFTP.KeepAlive = false; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); Stream ftpStream = response.GetResponseStream(); long cl = response.ContentLength; int bufferSize = 2048; int readCount; byte[] buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, 0, bufferSize); while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); } ftpStream.Close(); outputStream.Close(); response.Close(); return 0; } catch (Exception ex) { // Logging.WriteError(ex.Message + ex.StackTrace); System.Windows.Forms.MessageBox.Show(ex.Message); return -2; } }