ftp文件上传和下载_后台下载ftp文件上传和下载_后台下载_02


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 }

View Code

 


ftp文件上传和下载_后台下载ftp文件上传和下载_后台下载_02


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 }

View Code