参考了网上一些代码,作了一些调整优化。
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 | } |