1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Net; 6 using System.Threading; 7 using System.IO; 8 9 namespace FtpHelper 10 { 11 public delegate void DownloadCompleteHandler(); 12 public delegate void DownloadProgressHandler(int bytesRead, int totalBytes); 13 /// <summary> 14 /// ftp下载类 15 /// </summary> 16 public class FtpDownload 17 { 18 public DownloadCompleteHandler CompleteCallback; 19 public DownloadProgressHandler ProgressCallback; 20 private FtpWebRequest reqFTP = null; 21 private FtpWebResponse resFTP = null; 22 private Thread mThread = null; 23 //下载文件到本地的存储路径 24 private string sFileName = string.Empty; 25 26 public string DlFileName 27 { 28 get { return sFileName; } 29 set { sFileName = value; } 30 } 31 private FileStream outputStream = null; 32 private Stream ftpStream = null; 33 public bool IsComplete = false; 34 //用于终止下载 35 private bool stopFlag = false; 36 //从Ftp下载的文件路径,示例:"ftp://192.168.2.200/Project/asss.xls" 37 private string sFtpUrl = string.Empty; 38 private string sFtpUser = string.Empty; 39 private string sFtpPassword = string.Empty; 40 public int BytesProcessed; 41 42 public FtpDownload(string sUrlPath, string ftpUser, string ftpPassword) 43 { 44 sFtpUrl = sUrlPath; 45 sFtpUser = ftpUser; 46 sFtpPassword = ftpPassword; 47 48 } 49 /// <summary> 50 /// 后台下载 51 /// </summary> 52 public void DownloadBackgroundFile() 53 { 54 if (CompleteCallback == null) 55 throw new ArgumentException("No download complete callback specified."); 56 //实例化下载线程 57 mThread = new Thread(new ThreadStart(Download)); 58 mThread.Name = "WebDownload.dlThread"; 59 mThread.IsBackground = true; 60 mThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture; 61 //开启后台下载线程 62 mThread.Start(); 63 } 64 protected void Download() 65 { 66 try 67 { 68 if (stopFlag) 69 { 70 IsComplete = true; 71 return; 72 } 73 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(sFtpUrl)); 74 reqFTP.UseBinary = true; 75 reqFTP.Proxy = null; 76 reqFTP.UsePassive = false; 77 reqFTP.Credentials = new NetworkCredential(sFtpUser, sFtpPassword); 78 if (stopFlag) 79 { 80 IsComplete = true; 81 return; 82 } 83 resFTP = (FtpWebResponse)reqFTP.GetResponse(); 84 ftpStream = resFTP.GetResponseStream(); 85 long ContentLength = resFTP.ContentLength; 86 int bufferSize = 2048; 87 byte[] readBuffer = new byte[bufferSize]; 88 outputStream = new FileStream(sFileName, FileMode.Create); 89 while (true) 90 { 91 if (stopFlag) 92 { 93 IsComplete = true; 94 return; 95 } 96 // Pass do.readBuffer to BeginRead. 97 int bytesRead = ftpStream.Read(readBuffer, 0, bufferSize); 98 if (bytesRead <= 0) 99 break; 100 outputStream.Write(readBuffer, 0, bytesRead); 101 BytesProcessed += bytesRead; 102 OnProgressCallback(BytesProcessed, (int)ContentLength); 103 } 104 105 OnCompleteCallback(); 106 } 107 catch (Exception ex) 108 { 109 try 110 { 111 // Remove broken file download 112 if (outputStream != null) 113 { 114 outputStream.Close(); 115 outputStream = null; 116 } 117 if (sFileName != null && sFileName.Length > 0) 118 { 119 File.Delete(sFileName); 120 } 121 } 122 catch (Exception) 123 { 124 } 125 Logger.Log.Write(ex.Message); 126 } 127 finally 128 { 129 if (resFTP != null) 130 { 131 resFTP.Close(); 132 resFTP = null; 133 } 134 if (ftpStream != null) 135 { 136 ftpStream.Close(); 137 ftpStream.Dispose(); 138 } 139 if (outputStream != null) 140 { 141 outputStream.Close(); 142 outputStream.Dispose(); 143 } 144 IsComplete = true; 145 } 146 147 } 148 149 private void OnProgressCallback(int bytesRead, int totalBytes) 150 { 151 if (ProgressCallback != null) 152 { 153 ProgressCallback(bytesRead, totalBytes); 154 } 155 } 156 private void OnCompleteCallback() 157 { 158 if (CompleteCallback != null) 159 { 160 CompleteCallback(); 161 } 162 } 163 /// 终止当前下载 164 /// </summary> 165 public void Cancel() 166 { 167 CompleteCallback = null; 168 ProgressCallback = null; 169 if (mThread != null && mThread != Thread.CurrentThread) 170 { 171 if (mThread.IsAlive) 172 { 173 // Log.Write(Log.Levels.Verbose, "WebDownload.Cancel() : stopping download thread..."); 174 stopFlag = true; 175 if (!mThread.Join(500)) 176 { 177 //Log.Write(Log.Levels.Warning, "WebDownload.Cancel() : download thread refuses to die, forcing Abort()"); 178 mThread.Abort(); 179 } 180 } 181 mThread = null; 182 } 183 } 184 185 public void Dispose() 186 { 187 if (mThread != null && mThread != Thread.CurrentThread) 188 { 189 if (mThread.IsAlive) 190 { 191 // Log.Write(Log.Levels.Verbose, "WebDownload.Dispose() : stopping download thread..."); 192 stopFlag = true; 193 if (!mThread.Join(500)) 194 { 195 // Log.Write(Log.Levels.Warning, "WebDownload.Dispose() : download thread refuses to die, forcing Abort()"); 196 mThread.Abort(); 197 } 198 } 199 mThread = null; 200 } 201 202 if (reqFTP != null) 203 { 204 reqFTP.Abort(); 205 reqFTP = null; 206 } 207 208 if (outputStream != null) 209 { 210 outputStream.Close(); 211 outputStream = null; 212 } 213 214 //if (DownloadStartTime != DateTime.MinValue) 215 // OnDebugCallback(this); 216 217 GC.SuppressFinalize(this); 218 } 219 } 220 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Net; 6 using System.Threading; 7 using System.IO; 8 9 namespace FtpHelper 10 { 11 public delegate void UploadCompleteHandler(); 12 public delegate void UploadProgressHandler(int bytesRead, int totalBytes); 13 public class FtpUpload 14 { 15 public UploadCompleteHandler CompleteCallback; 16 public UploadProgressHandler ProgressCallback; 17 private FtpWebRequest reqFTP; 18 private FtpWebResponse resFTP; 19 private Thread mThread = null; 20 //本地文件路径 21 private string sFileName = string.Empty; 22 23 public string UlFileName 24 { 25 get { return sFileName; } 26 set { sFileName = value; } 27 } 28 private Stream uploadStream = null; 29 public bool IsComplete = false; 30 //用于终止上传 31 private bool stopFlag = false; 32 //上传到Ftp路径,示例:"ftp://192.168.2.200/Project/asss.xls" 33 private string sFtpUrl = string.Empty; 34 private string sFtpUser = string.Empty; 35 private string sFtpPassword = string.Empty; 36 private int BytesProcessed; 37 public FtpUpload(string sUrlPath, string ftpUser, string ftpPassword) 38 { 39 sFtpUrl = sUrlPath; 40 sFtpUser = ftpUser; 41 sFtpPassword = ftpPassword; 42 } 43 44 /// <summary> 45 /// 后台上传 46 /// </summary> 47 public void UploadBackgroundFile() 48 { 49 if (CompleteCallback == null) 50 throw new ArgumentException("未定义上传成功后执行的回调函数!"); 51 //实例化下载线程 52 mThread = new Thread(new ThreadStart(Upload)); 53 mThread.Name = "upload"; 54 mThread.IsBackground = true; 55 mThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture; 56 //开启后台下载线程 57 mThread.Start(); 58 } 59 protected void Upload() 60 { 61 using (FileStream fileStream = new FileStream(sFileName, FileMode.Open)) 62 { 63 byte[] fsdata = new byte[Convert.ToInt32(fileStream.Length)]; 64 fileStream.Read(fsdata, 0, Convert.ToInt32(fileStream.Length)); 65 try 66 { 67 if (stopFlag) 68 { 69 IsComplete = true; 70 return; 71 } 72 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(sFtpUrl)); 73 reqFTP.UseBinary = true; 74 reqFTP.Proxy = null; 75 reqFTP.UsePassive = false; 76 reqFTP.Credentials = new NetworkCredential(sFtpUser, sFtpPassword); 77 if (stopFlag) 78 { 79 IsComplete = true; 80 return; 81 } 82 83 reqFTP.KeepAlive = false; 84 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 85 reqFTP.ContentLength = fileStream.Length; 86 87 int buffLength = 2048; 88 byte[] buffer = new byte[buffLength]; 89 90 uploadStream = reqFTP.GetRequestStream(); 91 fileStream.Position = 0; 92 while (true) 93 { 94 if (stopFlag) 95 { 96 IsComplete = true; 97 return; 98 } 99 int bytesRead = fileStream.Read(buffer, 0, buffLength); 100 if (bytesRead <= 0) 101 break; 102 uploadStream.Write(buffer, 0, bytesRead); 103 104 BytesProcessed += bytesRead; 105 OnProgressCallback(BytesProcessed, (int)reqFTP.ContentLength); 106 } 107 OnCompleteCallback(); 108 } 109 catch (Exception ex) 110 { 111 if (fileStream != null) 112 { 113 fileStream.Close(); 114 //fileStream = null; 115 } 116 Logger.Log.Write(ex.Message); 117 //throw; 118 } 119 finally 120 { 121 if (uploadStream != null) 122 { 123 uploadStream.Close(); 124 uploadStream.Dispose(); 125 } 126 reqFTP = null; 127 IsComplete = true; 128 } 129 } 130 } 131 private void OnProgressCallback(int bytesRead, int totalBytes) 132 { 133 if (ProgressCallback != null) 134 { 135 ProgressCallback(bytesRead, totalBytes); 136 } 137 } 138 private void OnCompleteCallback() 139 { 140 if (CompleteCallback != null) 141 { 142 CompleteCallback(); 143 } 144 } 145 /// 终止当前下载 146 /// </summary> 147 public void Cancel() 148 { 149 CompleteCallback = null; 150 ProgressCallback = null; 151 if (mThread != null && mThread != Thread.CurrentThread) 152 { 153 if (mThread.IsAlive) 154 { 155 // Log.Write(Log.Levels.Verbose, "WebDownload.Cancel() : stopping download thread..."); 156 stopFlag = true; 157 if (!mThread.Join(500)) 158 { 159 //Log.Write(Log.Levels.Warning, "WebDownload.Cancel() : download thread refuses to die, forcing Abort()"); 160 mThread.Abort(); 161 } 162 } 163 mThread = null; 164 } 165 } 166 167 public void Dispose() 168 { 169 if (mThread != null && mThread != Thread.CurrentThread) 170 { 171 if (mThread.IsAlive) 172 { 173 // Log.Write(Log.Levels.Verbose, "WebDownload.Dispose() : stopping download thread..."); 174 stopFlag = true; 175 if (!mThread.Join(500)) 176 { 177 //Log.Write(Log.Levels.Warning, "WebDownload.Dispose() : download thread refuses to die, forcing Abort()"); 178 mThread.Abort(); 179 } 180 } 181 mThread = null; 182 } 183 184 if (reqFTP != null) 185 { 186 reqFTP.Abort(); 187 reqFTP = null; 188 } 189 190 //if (DownloadStartTime != DateTime.MinValue) 191 // OnDebugCallback(this); 192 GC.SuppressFinalize(this); 193 } 194 195 } 196 }