/// <summary> /// 下载文件 /// </summary> /// <param name="remotefile">远程文件</param> /// <param name="localfile">本地文件</param> /// <param name="mode">端点续传模式</param> /// <returns></returns> public Int64 DownloadFile(String remotefile, String localfile, FtpTransportMode mode) { #region 准备工作 if (String.IsNullOrEmpty(remotefile)) { return(0); } if (String.IsNullOrEmpty(localfile)) { var str = remotefile; if (str.Contains("/")) { str = str.Substring(str.LastIndexOf("/") + 1); } localfile = str; } if (localfile[1] != Path.VolumeSeparatorChar) { localfile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, localfile); } if (File.Exists(localfile)) { if (mode == FtpTransportMode.OverWrite) { File.Delete(localfile); } else if (mode == FtpTransportMode.None) { return(0); } //throw new Exception("目标文件已存在!"); } #endregion var e = new LoadFileEventArgs(); if (OnDownloadFile != null) { e.Cancel = false; e.Src = remotefile; e.Des = localfile; var fi = new FileInfo(localfile); if (fi != null && fi.Exists) { e.DesSize = fi.Length; } OnDownloadFile(this, e); if (e.Cancel) { return(0); } } try { #region 载 var ftp = GetFtpRequest(remotefile); ftp.Method = WebRequestMethods.Ftp.DownloadFile; ftp.UseBinary = true; if (!Directory.Exists(Path.GetDirectoryName(localfile))) { Directory.CreateDirectory(Path.GetDirectoryName(localfile)); } var fs = new FileStream(localfile, FileMode.OpenOrCreate, FileAccess.Write); //如果采用断点续传,则从断点处开始 if (mode == FtpTransportMode.Append) { //取远程文件大小 var size = GetFileSize(remotefile); if (fs.Length >= size) { return(0); } //设置断点 ftp.ContentOffset = fs.Length; } var buffer = new Byte[2048]; Int64 count = 0; using (var response = GetResponse(ftp)) { using (var responseStream = response.GetResponseStream()) { try { var read = 0; do { read = responseStream.Read(buffer, 0, buffer.Length); count += read; fs.Write(buffer, 0, read); } while (read != 0); } finally { fs.Close(); responseStream.Close(); } } response.Close(); } e.SrcSize = count; return(count); #endregion } finally { if (OnDownloadFileFinished != null) { var fi = new FileInfo(localfile); if (fi != null && fi.Exists) { e.DesSize = fi.Length; } OnDownloadFileFinished(this, e); } } }
/// <summary> /// 上传文件 /// </summary> /// <param name="localfile">本地文件</param> /// <param name="remotefile">远程文件</param> /// <param name="mode">模式</param> /// <returns></returns> public Int64 UploadFile(String localfile, String remotefile, FtpTransportMode mode) { #region 准备工作 if (String.IsNullOrEmpty(localfile)) { throw new ArgumentNullException("localfile", "没有指定本地文件名。"); } if (String.IsNullOrEmpty(remotefile)) { throw new ArgumentNullException("remotefile", "没有指定远程文件名。"); } if (localfile[1] != Path.VolumeSeparatorChar) { localfile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, localfile); } var fi = new FileInfo(localfile); if (!fi.Exists) { throw new Exception("本地文件不存在。"); } //if (String.IsNullOrEmpty(remotefile)) remotefile = fi.Name; var e = new LoadFileEventArgs(); if (OnUploadFile != null) { e.Cancel = false; e.Src = localfile; e.SrcSize = fi.Length; e.Des = remotefile; OnUploadFile(this, e); if (e.Cancel) { return(0); } } #endregion try { #region var ftp = GetFtpRequest(remotefile); ftp.Method = WebRequestMethods.Ftp.UploadFile; ftp.UseBinary = true; var buffer = new Byte[2048]; Int64 size = 0; using (var fs = fi.OpenRead()) { try { //如果采用断点续传,则从断点处开始 if (mode == FtpTransportMode.Append) { //取远程文件大小 var size2 = GetFileSize(remotefile); if (fs.Length <= size2) { return(size2); } //设置断点 ftp.ContentOffset = size2; fs.Position = size2; } using (var rs = ftp.GetRequestStream()) { Int32 dataRead; do { dataRead = fs.Read(buffer, 0, buffer.Length); size += dataRead; rs.Write(buffer, 0, dataRead); } while (dataRead >= buffer.Length); rs.Close(); } } finally { fs.Close(); } } e.DesSize = size; return(size); #endregion } finally { OnUploadFileFinished?.Invoke(this, e); } }