参考了网上一些代码,作了一些调整优化。
001
class="keyword">using System;
002
using System.Collections.Generic;
003
using System.Linq;
004
using System.Text;
005
using System.Net;
006
using System.IO;
007
008
public class FTPHelper
009
{
010
/// <summary>
011
/// FTP请求对象
012
/// </summary>
013
FtpWebRequest request = null;
014
/// <summary>
015
/// FTP响应对象
016
/// </summary>
017
FtpWebResponse response = null;
018
/// <summary>
019
/// FTP服务器地址
020
/// </summary>
021
public string ftpURI { get; private set; }
022
/// <summary>
023
/// FTP服务器IP
024
/// </summary>
025
public string ftpServerIP { get; private set; }
026
/// <summary>
027
/// FTP服务器默认目录
028
/// </summary>
029
public string ftpRemotePath { get; private set; }
030
/// <summary>
031
/// FTP服务器登录用户名
032
/// </summary>
033
public string ftpUserID { get; private set; }
034
/// <summary>
035
/// FTP服务器登录密码
036
/// </summary>
037
public string ftpPassword { get; private set; }
038
039
/// <summary>
040
/// 初始化
041
/// </summary>
042
/// <param name="FtpServerIP">FTP连接地址</param>
043
/// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>
044
/// <param name="FtpUserID">用户名</param>
045
/// <param name="FtpPassword">密码</param>
046
public FTPHelper(string ftpServerIP, string ftpRemotePath, string ftpUserID, stringftpPassword)
047
{
048
this.ftpServerIP = ftpServerIP;
049
this.ftpRemotePath = ftpRemotePath;
050
this.ftpUserID = ftpUserID;
051
this.ftpPassword = ftpPassword;
052
this.ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
053
}
054
~FTPHelper()
055
{
056
if (response != null)
057
{
058
response.Close();
059
response = null;
060
}
061
if (request != null)
062
{
063
request.Abort();
064
request = null;
065
}
066
}
067
/// <summary>
068
/// 建立FTP链接,返回响应对象
069
/// </summary>
070
/// <param name="uri">FTP地址</param>
071
/// <param name="ftpMethod">操作命令</param>
072
/// <returns></returns>
073
private FtpWebResponse Open(Uri uri, string ftpMethod)
074
{
075
request = (FtpWebRequest)FtpWebRequest.Create(uri);
076
request.Method = ftpMethod;
077
request.UseBinary = true;
078
request.KeepAlive = false;
079
request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);
080
return (FtpWebResponse)request.GetResponse();
081
}
082
083
/// <summary>
084
/// 建立FTP链接,返回请求对象
085
/// </summary>
086
/// <param name="uri">FTP地址</param>
087
/// <param name="ftpMethod">操作命令</param>
088
private FtpWebRequest OpenRequest(Uri uri, string ftpMethod)
089
{
090
request = (FtpWebRequest)WebRequest.Create(uri);
091
request.Method = ftpMethod;
092
request.UseBinary = true;
093
request.KeepAlive = false;
094
request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);
095
return request;
096
}
097
/// <summary>
098
/// 创建目录
099
/// </summary>
100
/// <param name="remoteDirectoryName">目录名</param>
101
public void CreateDirectory(string remoteDirectoryName)
102
{
103
response = Open(newUri(ftpURI + remoteDirectoryName), WebRequestMethods.Ftp.MakeDirectory);
104
}
105
/// <summary>
106
/// 更改目录或文件名
107
/// </summary>
108
/// <param name="currentName">当前名称</param>
109
/// <param name="newName">修改后新名称</param>
110
public void ReName(string currentName, string newName)
111
{
112
request = OpenRequest(newUri(ftpURI + currentName), WebRequestMethods.Ftp.Rename);
113
request.RenameTo = newName;
114
response = (FtpWebResponse)request.GetResponse();
115
}
116
/// <summary>
117
/// 切换当前目录
118
/// </summary>
119
/// <param name="IsRoot">true:绝对路径 false:相对路径</param>
120
public void GotoDirectory(string DirectoryName, bool IsRoot)
121
{
122
if (IsRoot)
123
ftpRemotePath = DirectoryName;
124
else
125
ftpRemotePath += "/" + DirectoryName;
126
127
ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
128
}
129
/// <summary>
130
/// 删除目录(包括下面所有子目录和子文件)
131
/// </summary>
132
/// <param name="remoteDirectoryName">要删除的带路径目录名:如web/test</param>
133
/*
134
* 例:删除test目录
135
FTPHelper helper = new FTPHelper("x.x.x.x", "web", "user", "password");
136
helper.RemoveDirectory("web/test");
137
*/
138
public void RemoveDirectory(string remoteDirectoryName)
139
{
140
GotoDirectory(remoteDirectoryName, true);
141
var listAll = ListFilesAndDirectories();
142
foreach (var m in listAll)
143
{
144
if(m.IsDirectory)
145
RemoveDirectory(m.Path);
146
else
147
DeleteFile(m.Name);
148
}
149
GotoDirectory(remoteDirectoryName, true);
150
response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory);
151
}
152
/// <summary>
153
/// 文件上传
154
/// </summary>
155
/// <param name="localFilePath">本地文件路径</param>
156
public void Upload(string localFilePath)
157
{
158
FileInfo fileInf = new FileInfo(localFilePath);
159
request = OpenRequest(newUri(ftpURI + fileInf.Name), WebRequestMethods.Ftp.UploadFile);
160
request.ContentLength = fileInf.Length;
161
int buffLength = 2048;
162
byte[] buff = new byte[buffLength];
163
int contentLen;
164
using (var fs = fileInf.OpenRead())
165
{
166
using (var strm = request.GetRequestStream())
167
{
168
contentLen = fs.Read(buff, 0, buffLength);
169
while (contentLen != 0)
170
{
171
strm.Write(buff, 0, contentLen);
172
contentLen = fs.Read(buff, 0, buffLength);
173
}
174
}
175
}
176
}
177
/// <summary>
178
/// 删除文件
179
/// </summary>
180
/// <param name="remoteFileName">要删除的文件名</param>
181
public void DeleteFile(string remoteFileName)
182
{
183
response = Open(newUri(ftpURI + remoteFileName), WebRequestMethods.Ftp.DeleteFile);
184
}
185
186
/// <summary>
187
/// 获取当前目录的文件和一级子目录信息
188
/// </summary>
189
/// <returns></returns>
190
public List<FileStruct> ListFilesAndDirectories()
191
{
192
var fileList = new List<FileStruct>();
193
response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.ListDirectoryDetails);
194
using (var stream = response.GetResponseStream())
195
{
196
using (var sr = new StreamReader(stream))
197
{
198
string line = null;
199
while ((line = sr.ReadLine()) != null)
200
{
201
//line的格式如下:
202
//08-18-13 11:05PM <DIR> aspnet_client
203
//09-22-13 11:39PM 2946 Default.aspx
204
DateTime dtDate = DateTime.ParseExact(line.Substring(0, 8), "MM-dd-yy", null);
205
DateTime dtDateTime = DateTime.Parse(dtDate.ToString("yyyy-MM-dd") + line.Substring(8, 9));
206
string[] arrs = line.Split(' ');
207
var model = new FileStruct()
208
{
209
IsDirectory = line.IndexOf("<DIR>") > 0 ? true : false,
210
CreateTime = dtDateTime,
211
Name = arrs[arrs.Length - 1],
212
Path = ftpRemotePath + "/" + arrs[arrs.Length - 1]
213
};
214
fileList.Add(model);
215
}
216
}
217
}
218
return fileList;
219
}
220
/// <summary>
221
/// 列出当前目录的所有文件
222
/// </summary>
223
public List<FileStruct> ListFiles()
224
{
225
var listAll = ListFilesAndDirectories();
226
var listFile = listAll.Where(m => m.IsDirectory == false).ToList();
227
return listFile;
228
}
229
/// <summary>
230
/// 列出当前目录的所有一级子目录
231
/// </summary>
232
public List<FileStruct> ListDirectories()
233
{
234
var listAll = ListFilesAndDirectories();
235
var listFile = listAll.Where(m => m.IsDirectory == true).ToList();
236
return listFile;
237
}
238
/// <summary>
239
/// 判断当前目录下指定的子目录或文件是否存在
240
/// </summary>
241
/// <param name="remoteName">指定的目录或文件名</param>
242
public bool IsExist(string remoteName)
243
{
244
var list = ListFilesAndDirectories();
245
if (list.Count(m => m.Name == remoteName) > 0)
246
return true;
247
return false;
248
}
249
/// <summary>
250
/// 判断当前目录下指定的一级子目录是否存在
251
/// </summary>
252
/// <param name="RemoteDirectoryName">指定的目录名</param>
253
public bool IsDirectoryExist(string remoteDirectoryName)
254
{
255
var listDir = ListDirectories();
256
if (listDir.Count(m => m.Name == remoteDirectoryName) > 0)
257
return true;
258
return false;
259
}
260
/// <summary>
261
/// 判断当前目录下指定的子文件是否存在
262
/// </summary>
263
/// <param name="RemoteFileName">远程文件名</param>
264
public bool IsFileExist(string remoteFileName)
265
{
266
var listFile = ListFiles();
267
if (listFile.Count(m => m.Name == remoteFileName) > 0)
268
return true;
269
return false;
270
}
271
272
/// <summary>
273
/// 下载
274
/// </summary>
275
/// <param name="saveFilePath">下载后的保存路径</param>
276
/// <param name="downloadFileName">要下载的文件名</param>
277
public void Download(string saveFilePath, string downloadFileName)
278
{
279
using (FileStream outputStream = new FileStream(saveFilePath + "\\"+ downloadFileName, FileMode.Create))
280
{
281
response = Open(newUri(ftpURI + downloadFileName), WebRequestMethods.Ftp.DownloadFile);
282
using (Stream ftpStream = response.GetResponseStream())
283
{
284
long cl = response.ContentLength;
285
int bufferSize = 2048;
286
int readCount;
287
byte[] buffer = new byte[bufferSize];
288
readCount = ftpStream.Read(buffer, 0, bufferSize);
289
while (readCount > 0)
290
{
291
outputStream.Write(buffer, 0, readCount);
292
readCount = ftpStream.Read(buffer, 0, bufferSize);
293
}
294
}
295
}
296
}
297
298
299
}
300
301
public class FileStruct
302
{
303
/// <summary>
304
/// 是否为目录
305
/// </summary>
306
public bool IsDirectory { get; set; }
307
/// <summary>
308
/// 创建时间
309
/// </summary>
310
public DateTime CreateTime { get; set; }
311
/// <summary>
312
/// 文件或目录名称
313
/// </summary>
314
public string Name { get; set; }
315
/// <summary>
316
/// 路径
317
/// </summary>
318
public string Path { get; set; }
319
}