using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; public class FTPHelper { /// /// FTP请求对象 /// FtpWebRequest request = null; /// /// FTP响应对象 /// FtpWebResponse response = null; /// /// FTP服务器地址 /// public string ftpURI { get; private set; } /// /// FTP服务器IP /// public string ftpServerIP { get; private set; } /// /// FTP服务器默认目录 /// public string ftpRemotePath { get; private set; } /// /// FTP服务器登录用户名 /// public string ftpUserID { get; private set; } /// /// FTP服务器登录密码 /// public string ftpPassword { get; private set; } /// /// 初始化 /// /// FTP连接地址 /// 指定FTP连接成功后的当前目录, 如果不指定即默认为根目录 /// 用户名 /// 密码 public FTPHelper(string ftpServerIP, string ftpRemotePath, string ftpUserID, string ftpPassword) { this.ftpServerIP = ftpServerIP; this.ftpRemotePath = ftpRemotePath; this.ftpUserID = ftpUserID; this.ftpPassword = ftpPassword; this.ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; } ~FTPHelper() { if (response != null) { response.Close(); response = null; } if (request != null) { request.Abort(); request = null; } } /// /// 建立FTP链接,返回响应对象 /// /// FTP地址 /// 操作命令 /// private FtpWebResponse Open(Uri uri, string ftpMethod) { FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(uri); request.Method = ftpMethod; request.UseBinary = true; request.KeepAlive = false; request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword); return (FtpWebResponse)request.GetResponse(); } /// /// 建立FTP链接,返回请求对象 /// /// FTP地址 /// 操作命令 private FtpWebRequest OpenRequest(Uri uri, string ftpMethod) { request = (FtpWebRequest)WebRequest.Create(uri); request.Method = ftpMethod; request.UseBinary = true; request.KeepAlive = false; request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword); return request; } /// /// 创建目录 /// /// 目录名 public void CreateDirectory(string remoteDirectoryName) { response = Open(new Uri(ftpURI + remoteDirectoryName), WebRequestMethods.Ftp.MakeDirectory); } /// /// 更改目录或文件名 /// /// 当前名称 /// 修改后新名称 public void ReName(string currentName, string newName) { request = OpenRequest(new Uri(ftpURI + currentName), WebRequestMethods.Ftp.Rename); request.RenameTo = newName; response = (FtpWebResponse)request.GetResponse(); } /// /// 切换当前目录 /// /// true:绝对路径 false:相对路径 public void GotoDirectory(string DirectoryName, bool IsRoot) { if (IsRoot) ftpRemotePath = DirectoryName; else ftpRemotePath += "/" + DirectoryName; ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; } /// /// 删除目录(包括下面所有子目录和子文件) /// /// 要删除的带路径目录名:如web/test /* * 例:删除test目录 FTPHelper helper = new FTPHelper("x.x.x.x", "web", "user", "password"); helper.RemoveDirectory("web/test"); */ public void RemoveDirectory(string remoteDirectoryName) { GotoDirectory(remoteDirectoryName, true); var listAll = ListFilesAndDirectories(); foreach (var m in listAll) { if (m.IsDirectory) RemoveDirectory(m.Path); else DeleteFile(m.Name); } GotoDirectory(remoteDirectoryName, true); response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory); } /// /// 文件上传 /// /// 本地文件路径 public void Upload(string localFilePath) { FileInfo fileInf = new FileInfo(localFilePath); request = OpenRequest(new Uri(ftpURI + fileInf.Name), WebRequestMethods.Ftp.UploadFile); request.ContentLength = fileInf.Length; int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; using (var fs = fileInf.OpenRead()) { using (var strm = request.GetRequestStream()) { contentLen = fs.Read(buff, 0, buffLength); while (contentLen != 0) { strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } } } } /// /// 删除文件 /// /// 要删除的文件名 public void DeleteFile(string remoteFileName) { response = Open(new Uri(ftpURI + remoteFileName), WebRequestMethods.Ftp.DeleteFile); } /// /// 获取当前目录的文件和一级子目录信息 /// /// public List ListFilesAndDirectories() { var fileList = new List(); response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.ListDirectoryDetails); using (var stream = response.GetResponseStream()) { using (var sr = new StreamReader(stream)) { string line = null; while ((line = sr.ReadLine()) != null) { //line的格式如下: //08-18-13 11:05PM aspnet_client //09-22-13 11:39PM 2946 Default.aspx try { DateTime dtDate = DateTime.ParseExact(line.Substring(0, 8), "MM-dd-yy", null); DateTime dtDateTime = DateTime.Parse(dtDate.ToString("yyyy-MM-dd") + line.Substring(8, 9)); string[] arrs = line.Split(' '); var model = new FileStruct() { IsDirectory = line.IndexOf("") > 0 ? true : false, CreateTime = dtDateTime, Name = arrs[arrs.Length - 1], Path = ftpRemotePath + "/" + arrs[arrs.Length - 1] }; fileList.Add(model); } catch (Exception) { } } } } return fileList; } /// /// 获取当前目录的文件和一级子目录信息 /// /// public List GetLoadListFiles(string toDir) { var fileList = new List(); var returnFileList = new List(); using (FtpWebResponse response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.ListDirectory)) { using (var stream = response.GetResponseStream()) { using (var sr = new StreamReader(stream)) { string line = null; while ((line = sr.ReadLine()) != null) { try { if (line.ToUpper().IndexOf(".CSV") < 0) { continue; } var model = new FileStruct() { Name = line, Path = ftpURI + line }; if (!Directory.Exists(toDir)) { Directory.CreateDirectory(toDir); } fileList.Add(model); } catch (Exception ex) { AutoFileCopyNet.LogFileAccess.WriteLogFile("海天网络共享文件抓取失败,获取文件名失败" + ex.Message + ex.Source + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } } } } //foreach (FileStruct item in fileList)//因为获取时间不准确,只比较文件大小。 //{ // using (response = Open(new Uri(item.Path), WebRequestMethods.Ftp.GetDateTimestamp)) // { // try // { // item.UpdateTime = response.LastModified; // } // catch (Exception ex) // { // AutoFileCopyNet.LogFileAccess.WriteLogFile("海天数据文件获取UPDATETIME失败:" + ex.Message + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); // } // } //} foreach (FileStruct item in fileList) { if (File.Exists(toDir + item.Name))//如果文件存在判断与源文件大小比较 { FileInfo fInfo = new FileInfo(toDir + item.Name); using (response = Open(new Uri(item.Path), WebRequestMethods.Ftp.GetFileSize)) { try { if (fInfo.Length < response.ContentLength) { //if (Convert.ToDateTime(item.UpdateTime) == DateTime.MinValue) //{ item.UpdateTime = DateTime.Now; //} } else { continue; } } catch (Exception ex) { AutoFileCopyNet.LogFileAccess.WriteLogFile("海天数据文件获取UPDATETIME失败:" + ex.Message + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } } else { //if (Convert.ToDateTime(item.UpdateTime) == DateTime.MinValue) //{ item.UpdateTime = DateTime.Now; //} } using (FileStream outputStream = new FileStream(toDir + item.Name, FileMode.Create)) { using (response = Open(new Uri(item.Path), WebRequestMethods.Ftp.DownloadFile)) { using (Stream ftpStream = response.GetResponseStream()) { try { 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); } returnFileList.Add(item); } catch (Exception ex) { AutoFileCopyNet.LogFileAccess.WriteLogFile("海天数据文件拷贝失败:" + ex.Message + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } } } } return returnFileList; } /// /// 获取当前目录下文件列表(仅文件) /// /// public string[] GetFileList(string mask) { string[] downloadFiles; StringBuilder result = new StringBuilder(); FtpWebRequest reqFTP; try { reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI)); reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; WebResponse response = reqFTP.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default); string line = reader.ReadLine(); while (line != null) { if (mask.Trim() != string.Empty && mask.Trim() != "*.*") { string mask_ = mask.Substring(0, mask.IndexOf("*")); if (line.Substring(0, mask_.Length) == mask_) { result.Append(line); result.Append("\n"); } } else { result.Append(line); result.Append("\n"); } line = reader.ReadLine(); } result.Remove(result.ToString().LastIndexOf('\n'), 1); reader.Close(); response.Close(); return result.ToString().Split('\n'); } catch (Exception ex) { downloadFiles = null; if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。") { } return downloadFiles; } } /// /// 列出当前目录的所有文件 /// public List ListFiles() { var listAll = ListFilesAndDirectories(); var listFile = listAll.Where(m => m.IsDirectory == false).ToList(); return listFile; } /// /// 列出当前目录的所有一级子目录 /// public List ListDirectories() { var listAll = ListFilesAndDirectories(); var listFile = listAll.Where(m => m.IsDirectory == true).ToList(); return listFile; } /// /// 判断当前目录下指定的子目录或文件是否存在 /// /// 指定的目录或文件名 public bool IsExist(string remoteName) { var list = ListFilesAndDirectories(); if (list.Count(m => m.Name == remoteName) > 0) return true; return false; } /// /// 判断当前目录下指定的一级子目录是否存在 /// /// 指定的目录名 public bool IsDirectoryExist(string remoteDirectoryName) { var listDir = ListDirectories(); if (listDir.Count(m => m.Name == remoteDirectoryName) > 0) return true; return false; } /// /// 判断当前目录下指定的子文件是否存在 /// /// 远程文件名 public bool IsFileExist(string remoteFileName) { var listFile = ListFiles(); if (listFile.Count(m => m.Name == remoteFileName) > 0) return true; return false; } /// /// 下载 /// /// 下载后的保存路径 /// 要下载的文件名 public void Download(string saveFilePath, string downloadFileName) { using (FileStream outputStream = new FileStream(saveFilePath + "\\" + downloadFileName, FileMode.Create)) { response = Open(new Uri(ftpURI + downloadFileName), WebRequestMethods.Ftp.DownloadFile); using (Stream ftpStream = response.GetResponseStream()) { DateTime dtModify = response.LastModified; 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); } } } } } public class FileStruct { /// /// 是否为目录 /// public bool IsDirectory { get; set; } /// /// 创建时间 /// public DateTime CreateTime { get; set; } /// /// 修改时间 /// public DateTime UpdateTime { get; set; } /// /// 文件或目录名称 /// public string Name { get; set; } /// /// 路径 /// public string Path { get; set; } }