|
参考了网上一些代码,作了一些调整优化。
002 | using System.Collections.Generic; |
008 | public class FTPHelper |
013 | FtpWebRequest request = null; |
017 | FtpWebResponse response = null; |
021 | public string ftpURI { get; private set; } |
025 | public string ftpServerIP { get; private set; } |
029 | public string ftpRemotePath { get; private set; } |
033 | public string ftpUserID { get; private set; } |
037 | public string ftpPassword { get; private set; } |
043 | /// 指定FTP连接成功后的当前目录, 如果不指定即默认为根目录 |
046 | public FTPHelper(string ftpServerIP, string ftpRemotePath, string ftpUserID, stringftpPassword) |
048 | this.ftpServerIP = ftpServerIP; |
049 | this.ftpRemotePath = ftpRemotePath; |
050 | this.ftpUserID = ftpUserID; |
051 | this.ftpPassword = ftpPassword; |
052 | this.ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; |
056 | if (response != null) |
073 | private FtpWebResponse Open(Uri uri, string ftpMethod) |
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(); |
088 | private FtpWebRequest OpenRequest(Uri uri, string ftpMethod) |
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); |
101 | public void CreateDirectory(string remoteDirectoryName) |
103 | response = Open(newUri(ftpURI + remoteDirectoryName), WebRequestMethods.Ftp.MakeDirectory); |
110 | public void ReName(string currentName, string newName) |
112 | request = OpenRequest(newUri(ftpURI + currentName), WebRequestMethods.Ftp.Rename); |
113 | request.RenameTo = newName; |
114 | response = (FtpWebResponse)request.GetResponse(); |
119 | /// true:绝对路径 false:相对路径 |
120 | public void GotoDirectory(string DirectoryName, bool IsRoot) |
123 | ftpRemotePath = DirectoryName; |
125 | ftpRemotePath += "/" + DirectoryName; |
127 | ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; |
130 | /// 删除目录(包括下面所有子目录和子文件) |
132 | /// 要删除的带路径目录名:如web/test |
135 | FTPHelper helper = new FTPHelper("x.x.x.x", "web", "user", "password"); |
136 | helper.RemoveDirectory("web/test"); |
138 | public void RemoveDirectory(string remoteDirectoryName) |
140 | GotoDirectory(remoteDirectoryName, true); |
141 | var listAll = ListFilesAndDirectories(); |
142 | foreach (var m in listAll) |
145 | RemoveDirectory(m.Path); |
149 | GotoDirectory(remoteDirectoryName, true); |
150 | response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory); |
156 | public void Upload(string localFilePath) |
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]; |
164 | using (var fs = fileInf.OpenRead()) |
166 | using (var strm = request.GetRequestStream()) |
168 | contentLen = fs.Read(buff, 0, buffLength); |
169 | while (contentLen != 0) |
171 | strm.Write(buff, 0, contentLen); |
172 | contentLen = fs.Read(buff, 0, buffLength); |
181 | public void DeleteFile(string remoteFileName) |
183 | response = Open(newUri(ftpURI + remoteFileName), WebRequestMethods.Ftp.DeleteFile); |
187 | /// 获取当前目录的文件和一级子目录信息 |
190 | public List ListFilesAndDirectories() |
192 | var fileList = new List(); |
193 | response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.ListDirectoryDetails); |
194 | using (var stream = response.GetResponseStream()) |
196 | using (var sr = new StreamReader(stream)) |
199 | while ((line = sr.ReadLine()) != null) |
202 | //08-18-13 11:05PM 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() |
209 | IsDirectory = line.IndexOf("") > 0 ? true : false, |
210 | CreateTime = dtDateTime, |
211 | Name = arrs[arrs.Length - 1], |
212 | Path = ftpRemotePath + "/" + arrs[arrs.Length - 1] |
223 | public List ListFiles() |
225 | var listAll = ListFilesAndDirectories(); |
226 | var listFile = listAll.Where(m => m.IsDirectory == false).ToList(); |
232 | public List ListDirectories() |
234 | var listAll = ListFilesAndDirectories(); |
235 | var listFile = listAll.Where(m => m.IsDirectory == true).ToList(); |
239 | /// 判断当前目录下指定的子目录或文件是否存在 |
242 | public bool IsExist(string remoteName) |
244 | var list = ListFilesAndDirectories(); |
245 | if (list.Count(m => m.Name == remoteName) > 0) |
250 | /// 判断当前目录下指定的一级子目录是否存在 |
253 | public bool IsDirectoryExist(string remoteDirectoryName) |
255 | var listDir = ListDirectories(); |
256 | if (listDir.Count(m => m.Name == remoteDirectoryName) > 0) |
261 | /// 判断当前目录下指定的子文件是否存在 |
264 | public bool IsFileExist(string remoteFileName) |
266 | var listFile = ListFiles(); |
267 | if (listFile.Count(m => m.Name == remoteFileName) > 0) |
277 | public void Download(string saveFilePath, string downloadFileName) |
279 | using (FileStream outputStream = new FileStream(saveFilePath + "\\"+ downloadFileName, FileMode.Create)) |
281 | response = Open(newUri(ftpURI + downloadFileName), WebRequestMethods.Ftp.DownloadFile); |
282 | using (Stream ftpStream = response.GetResponseStream()) |
284 | long cl = response.ContentLength; |
285 | int bufferSize = 2048; |
287 | byte[] buffer = new byte[bufferSize]; |
288 | readCount = ftpStream.Read(buffer, 0, bufferSize); |
289 | while (readCount > 0) |
291 | outputStream.Write(buffer, 0, readCount); |
292 | readCount = ftpStream.Read(buffer, 0, bufferSize); |
301 | public class FileStruct |
306 | public bool IsDirectory { get; set; } |
310 | public DateTime CreateTime { get; set; } |
314 | public string Name { get; set; } |
318 | public string Path { get; set; } |
|
|