今天闲暇时,做了个FTP上传下载文件Demo。栗子很简单,就是自己封装的一个FTPHelper类型。直接贴出代码
public class FtpHelper { private static FtpHelper _instance; private static object locker = new object(); private FtpHelper() { } private string path = @"ftp://" + ConfigurationManager.AppSettings["FtpServerIP"].ToString() + "/"; //目标路径 private string ftpip = ConfigurationManager.AppSettings["FtpServerIP"].ToString(); //ftp IP地址 private string username = ConfigurationManager.AppSettings["FtpUserName"].ToString(); //ftp用户名 private string password = ConfigurationManager.AppSettings["FtpPassWord"].ToString(); //ftp密码 public static FtpHelper Instance{ get { if (_instance == null) { lock (locker) { if (_instance == null) _instance = new FtpHelper(); } } return _instance; } } #region 上传 public bool UploadFile(string filepath) { bool result = true; try { //创建FTP对象 var request = (FtpWebRequest)FtpWebRequest.Create(new Uri(path)+Path.GetFileName(filepath)); //设置请求参数 request.Credentials = new NetworkCredential(username, password); request.Method = WebRequestMethods.Ftp.UploadFile; request.UseBinary = true; request.UsePassive = false; //选择主动还是被动模式 , 这句要加上的。 request.KeepAlive = false;//一定要设置此属性,否则一次性下载多个文件的时候,会出现异常。 //将文件内容读入请求对象中 using (FileStream fs = new FileStream(filepath, FileMode.Open)) { using (var requstStream = request.GetRequestStream()) { int readSize = 2048; byte[] temp = new byte[2048]; bool isNext = fs.Read(temp, 0, readSize) > 0; while (isNext) { requstStream.Write(temp, 0, readSize); var s = fs.Position; isNext = fs.Read(temp, 0, readSize)> 0; s = fs.Position; } } } } catch (Exception ex) { result = false; } //返回操作结果 return result; } #endregion #region 下载 public bool DownLoadFile(string filename,string saveDir) { bool result = true; try { var request = (FtpWebRequest)FtpWebRequest.Create(new Uri(path) + filename); //设置请求参数 request.Credentials = new NetworkCredential(username, password); request.Method = WebRequestMethods.Ftp.DownloadFile; request.UseBinary = true; request.UsePassive = false; //选择主动还是被动模式 , 这句要加上的。 request.KeepAlive = false;//一定要设置此属性,否则一次性下载多个文件的时候,会出现异常。 WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); FileStream fs = new FileStream(saveDir + filename, FileMode.CreateNew); int readSize = 2048; byte[] temp = new byte[2048]; bool isNext = responseStream.Read(temp, 0, readSize) > 0; while (isNext) { fs.Write(temp, 0, readSize); isNext = responseStream.Read(temp, 0, readSize) > 0; } responseStream.Close(); fs.Close(); } catch (Exception ex) { result = false; } return result; } #endregion #region 获取文件 //获取ftp上面的文件和文件夹 public string[] GetFiles(string dir) { string[] downloadFiles; StringBuilder result = new StringBuilder(); FtpWebRequest request; try { request = (FtpWebRequest)FtpWebRequest.Create(new Uri(path + dir)); request.UseBinary = true; request.Credentials = new NetworkCredential(username, password);//设置用户名和密码 request.Method = WebRequestMethods.Ftp.ListDirectory; request.UseBinary = true; request.UsePassive = false; //选择主动还是被动模式 , 这句要加上的。 request.KeepAlive = false;//一定要设置此属性,否则一次性下载多个文件的时候,会出现异常。 WebResponse response = request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream()); string line = reader.ReadLine(); while (line != null) { result.Append(line); result.Append(" "); line = reader.ReadLine(); } result.Remove(result.ToString().LastIndexOf(' '), 1); reader.Close(); response.Close(); return result.ToString().Split(' '); } catch (Exception ex) { downloadFiles = null; return downloadFiles; } } #endregion }
测试代码:
#region FTP上传/下载文件测试 //获取文件列表 foreach (var item in FtpHelper.Instance.GetFiles(null)) { Console.WriteLine(item); } //批量上传文件 Thread thread = new Thread(() => { var files = Directory.GetFiles(@"D:健身视频"); foreach (var file in files) { bool? res = default(bool?); string filename = Path.GetFileName(file); Console.WriteLine("正在上传:" + filename); res = FtpHelper.Instance.UploadFile(file); } Console.WriteLine("上传完毕!"); }); thread.IsBackground = true; thread.Start(); thread.Join(); //下载文件 string saveDir = @"E:项目PatternStuPatternStuContentDownLoad"; string fileName = "IMG_20160303_174423.jpg"; Console.WriteLine("正在下载:" + fileName); FtpHelper.Instance.DownLoadFile(fileName, saveDir); Console.WriteLine("下载完成!"); #endregion Console.ReadKey();