参考了网上一些代码,作了一些调整优化。
001 |
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, string ftpPassword)
|
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( new Uri(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( new Uri(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( new Uri(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( new Uri(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( new Uri(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 |
} |