-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFtpClient.cs
299 lines (272 loc) · 9.74 KB
/
FtpClient.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Cache;
using System.Text;
namespace FTPClient
{
public class FtpClient
{
#region Field & Property
private string _host;
private string _userName;
private string _password;
private string ftpDirectory;
private bool downloadCompleted;
private bool uploadCompleted;
public string Host
{
get
{
return _host;
}
set
{
_host = value;
}
}
public string UserName
{
get
{
return _userName;
}
set
{
_userName = value;
}
}
public string Password
{
get
{
return _password;
}
set
{
_password = value;
}
}
public string FtpDirectory
{
get
{
if (ftpDirectory.StartsWith("ftp://"))
return ftpDirectory;
else
return "ftp://" + ftpDirectory;
}
set
{
ftpDirectory = value;
}
}
public bool DownloadCompleted
{
get
{
return downloadCompleted;
}
set
{
downloadCompleted = value;
}
}
public bool UploadCompleted
{
get
{
return uploadCompleted;
}
set
{
uploadCompleted = value;
}
}
#endregion
//基本属性定义
public FtpClient()
{
downloadCompleted = true;
uploadCompleted = true;
ftpDirectory = "";
}
//创建FTP基本登录类
public FtpClient(string host, string userName, string password)
{
_host = host;
_userName = userName;
_password = password;
ftpDirectory = "ftp://" + _host;
}
//获取基本FTP请求
public FtpWebRequest CreateFtpWebRequest()
{
FtpWebRequest request;
request = (FtpWebRequest)WebRequest.Create(ftpDirectory);
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
request.Credentials = new NetworkCredential(_userName, _password);
//reqFtp.UsePassive = false;这是因为在下载文件或者获取文件夹信息过程中出现读取中断而将其设置为false的,即出现“应PASV命令的请求,服务器返回了一个与FTP连接地址不同的地址”的异常。
request.KeepAlive = false;
return request;
}
//获取文件目录
public ArrayList GetDirectiories()
{
ArrayList directories = new ArrayList();
try
{
using(FtpWebResponse response = (FtpWebResponse)CreateFtpWebRequest().GetResponse())
{
Stream stream = response.GetResponseStream();
using (StreamReader reader = new StreamReader(stream, System.Text.Encoding.Default))
{
string directory;
while((directory = reader.ReadLine())!= null)
{
directories.Add(directory);
}
}
}
return directories;
}
catch
{
throw new Exception("错误:无法连接到: " + _host);
}
}
//改变文件目录
public ArrayList ChangeDirectory(string directoryName)
{
ftpDirectory += "/" + directoryName;
return GetDirectiories();
}
public ArrayList ChangeDirectoryUp()
{
if(ftpDirectory != "ftp://" + _host)
{
ftpDirectory = ftpDirectory.Remove(ftpDirectory.LastIndexOf("/"), ftpDirectory.Length - ftpDirectory.LastIndexOf("/"));
return GetDirectiories();
}
else
{
return GetDirectiories();
}
}
//用异步方式进行文件的下载
public void DownloadFileAsync(string ftpFileName, string localFileName)
{
WebClient client = new WebClient();
try
{
Uri uri = new Uri(ftpDirectory + "/" + ftpFileName);
FileInfo file = new FileInfo(localFileName);
if (file.Exists)
{
throw new Exception("错误: 文件 " + localFileName + " 不存在.");
}
else
{
client.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(client_DownloadFileCompleted);
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.Credentials = new NetworkCredential(_userName, _password);
client.DownloadFileAsync(uri, localFileName);
downloadCompleted = false;
}
}
catch (Exception)
{
client.Dispose();
throw new Exception("错误: 此文件不可下载.");
}
}
//将文件进行上传的函数
public void UploadFileAsync(string fileName)
{
try
{
RequestCachePolicy cache = new RequestCachePolicy(RequestCacheLevel.Reload);
WebClient client = new WebClient();
FileInfo file = new FileInfo(fileName);
Uri uri = new Uri((ftpDirectory + "/" + file.Name).ToString());
client.Credentials = new NetworkCredential(_userName, _password);
uploadCompleted = false;
if (file.Exists)
{
client.UploadFileCompleted += new UploadFileCompletedEventHandler(client_UploadFileCompleted);
client.UploadProgressChanged += new UploadProgressChangedEventHandler(client_UploadProgressChanged);
client.UploadFileAsync(uri, fileName);
}
}
catch (Exception)
{
throw new Exception("错误: 不能够上传");
}
}
//删除文件目录的主函数
public string DeleteFile(string fileName)
{
try
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpDirectory + "//" + fileName);
request.Method = WebRequestMethods.Ftp.DeleteFile;
request.Credentials = new NetworkCredential(_userName, _password);
request.KeepAlive = false;
request.UsePassive = true;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
return response.StatusDescription;
}
catch (Exception exc)
{
throw new Exception("错误: 无法删除文件" + fileName + " (" +exc.Message + ")");
}
}
private void client_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
{
this.OnUploadProgressChanged(sender, e);
}
private void client_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
{
this.OnUploadCompleted(sender, e);
}
private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
this.OnDownloadProgressChanged(sender, e);
}
private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
this.OnDownloadCompleted(sender, e);
}
#region Events
public delegate void DownProgressChangedEventHandler(object sender, DownloadProgressChangedEventArgs e);
public event DownProgressChangedEventHandler DownProgressChanged;
protected virtual void OnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
if (DownProgressChanged != null) DownProgressChanged(sender, e);
}
public delegate void DownCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
public event DownCompletedEventHandler DownCompleted;
protected virtual void OnDownloadCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
if (DownCompleted != null) DownCompleted(sender, e);
}
public delegate void UpProgressChangedEventHandler(object sender,UploadProgressChangedEventArgs e);
public event UpProgressChangedEventHandler UpProgressChanged;
protected virtual void OnUploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
{
if (UpProgressChanged != null) UpProgressChanged(sender, e);
}
public delegate void UpCompletedEventHandler(object sender, UploadFileCompletedEventArgs e);
public event UpCompletedEventHandler UpCompleted;
protected virtual void OnUploadCompleted(object sender, UploadFileCompletedEventArgs e)
{
if (UpCompleted != null) UpCompleted(sender, e);
}
#endregion
}
}