|
1. FTPHelper
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Net;
5 using System.Text;
6
7 public class FTPHelper
8 {
9 ///
10 /// 上传文件
11 ///
12 /// 需要上传的文件
13 /// 目标路径
14 /// ftp地址
15 /// ftp用户名
16 /// ftp密码
17 public static void UploadFile(FileInfo fileinfo, string targetDir, string hostname, string username, string password)
18 {
19 //1. check target
20 string target;
21 if (targetDir.Trim() == "")
22 {
23 return;
24 }
25 string filename = fileinfo.Name;
26 if (!string.IsNullOrEmpty(filename))
27 target = filename;
28 else
29 target = Guid.NewGuid().ToString(); //使用临时文件名
30
31 string URI = "FTP://" + hostname + "/" + targetDir + "/" + target;
32 ///WebClient webcl = new WebClient();
33 System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
34
35 //设置FTP命令 设置所要执行的FTP命令,
36 //ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假设此处为显示指定路径下的文件列表
37 ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
38 //指定文件传输的数据类型
39 ftp.UseBinary = true;
40 ftp.UsePassive = true;
41
42 //告诉ftp文件大小
43 ftp.ContentLength = fileinfo.Length;
44 //缓冲大小设置为2KB
45 const int BufferSize = 2048;
46 byte[] content = new byte[BufferSize - 1 + 1];
47 int dataRead;
48
49 //打开一个文件流 (System.IO.FileStream) 去读上传的文件
50 using (FileStream fs = fileinfo.OpenRead())
51 {
52 try
53 {
54 //把上传的文件写入流
55 using (Stream rs = ftp.GetRequestStream())
56 {
57 do
58 {
59 //每次读文件流的2KB
60 dataRead = fs.Read(content, 0, BufferSize);
61 rs.Write(content, 0, dataRead);
62 } while (!(dataRead < BufferSize));
63 rs.Close();
64 }
65
66 }
67 catch (Exception ex) { }
68 finally
69 {
70 fs.Close();
71 }
72
73 }
74
75 ftp = null;
76 }
77
78 ///
79 /// 下载文件
80 ///
81 /// 下载至本地路径
82 /// ftp目标文件路径
83 /// 从ftp要下载的文件名
84 /// ftp地址即IP
85 /// ftp用户名
86 /// ftp密码
87 public static void DownloadFile(string localDir, string FtpDir, string FtpFile, string hostname, string username, string password)
88 {
89 string URI = "FTP://" + hostname + "/" + FtpDir + "/" + FtpFile;
90 string tmpname = Guid.NewGuid().ToString();
91 string localfile = localDir + @"\" + tmpname;
92
93 System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
94 ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
95 ftp.UseBinary = true;
96 ftp.UsePassive = false;
97
98 using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
99 {
100 using (Stream responseStream = response.GetResponseStream())
101 {
102 //loop to read & write to file
103 using (FileStream fs = new FileStream(localfile, FileMode.CreateNew))
104 {
105 try
106 {
107 byte[] buffer = new byte[2048];
108 int read = 0;
109 do
110 {
111 read = responseStream.Read(buffer, 0, buffer.Length);
112 fs.Write(buffer, 0, read);
113 } while (!(read == 0));
114 responseStream.Close();
115 fs.Flush();
116 fs.Close();
117 }
118 catch (Exception)
119 {
120 //catch error and delete file only partially downloaded
121 fs.Close();
122 //delete target file as it's incomplete
123 File.Delete(localfile);
124 throw;
125 }
126 }
127
128 responseStream.Close();
129 }
130
131 response.Close();
132 }
133
134
135
136 try
137 {
138 File.Delete(localDir + @"\" + FtpFile);
139 File.Move(localfile, localDir + @"\" + FtpFile);
140
141
142 ftp = null;
143 ftp = GetRequest(URI, username, password);
144 ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile;
145 ftp.GetResponse();
146
147 }
148 catch (Exception ex)
149 {
150 File.Delete(localfile);
151 throw ex;
152 }
153
154 // 记录日志 "从" + URI.ToString() + "下载到" + localDir + @"\" + FtpFile + "成功." );
155 ftp = null;
156 }
157
158
159 ///
160 /// 下载文件
161 ///
162 /// 下载至本地路径
163 /// ftp目标文件路径
164 /// 从ftp要下载的文件名
165 /// ftp地址即IP
166 /// ftp用户名
167 /// ftp密码
168 public static byte[] DownloadFileBytes(string localDir, string FtpDir, string FtpFile, string hostname, string username, string password)
169 {
170 byte[] bts;
171 string URI = "FTP://" + hostname + "/" + FtpDir + "/" + FtpFile;
172 string tmpname = Guid.NewGuid().ToString();
173 string localfile = localDir + @"\" + tmpname;
174
175 System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
176 ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
177 ftp.UseBinary = true;
178 ftp.UsePassive = true;
179
180 using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
181 {
182 using (Stream responseStream = response.GetResponseStream())
183 {
184 //loop to read & write to file
185 using (MemoryStream fs = new MemoryStream())
186 {
187 try
188 {
189 byte[] buffer = new byte[2048];
190 int read = 0;
191 do
192 {
193 read = responseStream.Read(buffer, 0, buffer.Length);
194 fs.Write(buffer, 0, read);
195 } while (!(read == 0));
196 responseStream.Close();
197
198 //---
199 byte[] mbt = new byte[fs.Length];
200 fs.Read(mbt, 0, mbt.Length);
201
202 bts = mbt;
203 //---
204 fs.Flush();
205 fs.Close();
206 }
207 catch (Exception)
208 {
209 //catch error and delete file only partially downloaded
210 fs.Close();
211 //delete target file as it's incomplete
212 File.Delete(localfile);
213 throw;
214 }
215 }
216
217 responseStream.Close();
218 }
219
220 response.Close();
221 }
222
223 ftp = null;
224 return bts;
225 }
226
227 ///
228 /// 搜索远程文件
229 ///
230 ///
231 ///
232 ///
233 ///
234 ///
235 ///
236 public static List ListDirectory(string targetDir, string hostname, string username, string password, string SearchPattern)
237 {
238 List result = new List();
239 try
240 {
241 string URI = "FTP://" + hostname + "/" + targetDir + "/" + SearchPattern;
242
243 System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
244 ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectory;
245 ftp.UsePassive = true;
246 ftp.UseBinary = true;
247
248
249 string str = GetStringResponse(ftp);
250 str = str.Replace("\r\n", "\r").TrimEnd('\r');
251 str = str.Replace("\n", "\r");
252 if (str != string.Empty)
253 result.AddRange(str.Split('\r'));
254
255 return result;
256 }
257 catch { }
258 return null;
259 }
260
261 private static string GetStringResponse(FtpWebRequest ftp)
262 {
263 //Get the result, streaming to a string
264 string result = "";
265 using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
266 {
267 long size = response.ContentLength;
268 using (Stream datastream = response.GetResponseStream())
269 {
270 using (StreamReader sr = new StreamReader(datastream, System.Text.Encoding.Default))
271 {
272 result = sr.ReadToEnd();
273 sr.Close();
274 }
275
276 datastream.Close();
277 }
278
279 response.Close();
280 }
281
282 return result;
283 }
284
285 /// 在ftp服务器上创建目录
286 ///
287 /// 创建的目录名称
288 /// ftp地址
289 /// 用户名
290 /// 密码
291 public void MakeDir(string dirName, string ftpHostIP, string username, string password)
292 {
293 try
294 {
295 string uri = "ftp://" + ftpHostIP + "/" + dirName;
296 System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
297 ftp.Method = WebRequestMethods.Ftp.MakeDirectory;
298
299 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
300 response.Close();
301 }
302 catch (Exception ex)
303 {
304 throw new Exception(ex.Message);
305 }
306 }
307
308 ///
309 /// 删除文件
310 ///
311 /// 创建的目录名称
312 /// ftp地址
313 /// 用户名
314 /// 密码
315 public static void delFile(string dirName, string filename, string ftpHostIP, string username, string password)
316 {
317 try
318 {
319 string uri = "ftp://" + ftpHostIP + "/";
320 if (!string.IsNullOrEmpty(dirName)) {
321 uri += dirName + "/";
322 }
323 uri += filename;
324 System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
325 ftp.Method = WebRequestMethods.Ftp.DeleteFile;
326 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
327 response.Close();
328 }
329 catch (Exception ex)
330 {
331 throw new Exception(ex.Message);
332 }
333 }
334
335 ///
336 /// 删除目录
337 ///
338 /// 创建的目录名称
339 /// ftp地址
340 /// 用户名
341 /// 密码
342 public void delDir(string dirName, string ftpHostIP, string username, string password)
343 {
344 try
345 {
346 string uri = "ftp://" + ftpHostIP + "/" + dirName;
347 System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
348 ftp.Method = WebRequestMethods.Ftp.RemoveDirectory;
349 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
350 response.Close();
351 }
352 catch (Exception ex)
353 {
354 throw new Exception(ex.Message);
355 }
356 }
357
358 ///
359 /// 文件重命名
360 ///
361 /// 当前目录名称
362 /// 重命名目录名称
363 /// ftp地址
364 /// 用户名
365 /// 密码
366 public void Rename(string currentFilename, string newFilename, string ftpServerIP, string username, string password)
367 {
368 try
369 {
370
371 FileInfo fileInf = new FileInfo(currentFilename);
372 string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
373 System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
374 ftp.Method = WebRequestMethods.Ftp.Rename;
375
376 ftp.RenameTo = newFilename;
377 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
378
379 response.Close();
380 }
381 catch (Exception ex)
382 {
383 throw new Exception(ex.Message);
384 }
385 }
386
387 private static FtpWebRequest GetRequest(string URI, string username, string password)
388 {
389 //根据服务器信息FtpWebRequest创建类的对象
390 FtpWebRequest result = (FtpWebRequest)FtpWebRequest.Create(URI);
391 //提供身份验证信息
392 result.Credentials = new System.Net.NetworkCredential(username, password);
393 //设置请求完成之后是否保持到FTP服务器的控制连接,默认值为true
394 result.KeepAlive = false;
395 return result;
396 }
397
398 /*
399 ///
400 /// 向Ftp服务器上传文件并创建和本地相同的目录结构
401 /// 遍历目录和子目录的文件
402 ///
403 ///
404 private void GetFileSystemInfos(FileSystemInfo file)
405 {
406 string getDirecName = file.Name;
407 if (!ftpIsExistsFile(getDirecName, "192.168.0.172", "Anonymous", "") && file.Name.Equals(FileName))
408 {
409 MakeDir(getDirecName, "192.168.0.172", "Anonymous", "");
410 }
411 if (!file.Exists) return;
412 DirectoryInfo dire = file as DirectoryInfo;
413 if (dire == null) return;
414 FileSystemInfo[] files = dire.GetFileSystemInfos();
415
416 for (int i = 0; i < files.Length; i++)
417 {
418 FileInfo fi = files as FileInfo;
419 if (fi != null)
420 {
421 DirectoryInfo DirecObj = fi.Directory;
422 string DireObjName = DirecObj.Name;
423 if (FileName.Equals(DireObjName))
424 {
425 UploadFile(fi, DireObjName, "192.168.0.172", "Anonymous", "");
426 }
427 else
428 {
429 Match m = Regex.Match(files.FullName, FileName + "+.*" + DireObjName);
430 //UploadFile(fi, FileName+"/"+DireObjName, "192.168.0.172", "Anonymous", "");
431 UploadFile(fi, m.ToString(), "192.168.0.172", "Anonymous", "");
432 }
433 }
434 else
435 {
436 string[] ArrayStr = files.FullName.Split('\\');
437 string finame = files.Name;
438 Match m = Regex.Match(files.FullName, FileName + "+.*" + finame);
439 //MakeDir(ArrayStr[ArrayStr.Length - 2].ToString() + "/" + finame, "192.168.0.172", "Anonymous", "");
440 MakeDir(m.ToString(), "192.168.0.172", "Anonymous", "");
441 GetFileSystemInfos(files);
442 }
443 }
444 }
445 * */
446
447 ///
448 /// 判断ftp服务器上该目录是否存在
449 ///
450 ///
451 ///
452 ///
453 ///
454 ///
455 private bool ftpIsExistsFile(string dirName, string ftpHostIP, string username, string password)
456 {
457 bool flag = true;
458 try
459 {
460 string uri = "ftp://" + ftpHostIP + "/" + dirName;
461 System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
462 ftp.Method = WebRequestMethods.Ftp.ListDirectory;
463
464 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
465 response.Close();
466 }
467 catch (Exception)
468 {
469 flag = false;
470 }
471 return flag;
472 }
473 }
View Code
2. SFTPHelper
SFTPHelper采用第三方的Tamir.SharpSSH.dll
下载地址: http://www.tamirgal.com/blog/page/SharpSSH.aspx
1 using System;
2 using Tamir.SharpSsh.jsch;
3 using System.Collections;
4
5
6 public class SFTPHelper
7 {
8 private Session m_session;
9 private Channel m_channel;
10 private ChannelSftp m_sftp;
11
12 //host:sftp地址 user:用户名 pwd:密码
13 public SFTPHelper(string host, string user, string pwd)
14 {
15 string[] arr = host.Split(':');
16 string ip = arr[0];
17 int port = 22;
18 if (arr.Length > 1) port = Int32.Parse(arr[1]);
19
20 JSch jsch = new JSch();
21 m_session = jsch.getSession(user, ip, port);
22 MyUserInfo ui = new MyUserInfo();
23 ui.setPassword(pwd);
24 m_session.setUserInfo(ui);
25
26 }
27
28 //SFTP连接状态
29 public bool Connected { get { return m_session.isConnected(); } }
30
31 //连接SFTP
32 public bool Connect()
33 {
34 try
35 {
36 if (!Connected)
37 {
38 m_session.connect();
39 m_channel = m_session.openChannel("sftp");
40 m_channel.connect();
41 m_sftp = (ChannelSftp)m_channel;
42 }
43 return true;
44 }
45 catch
46 {
47 return false;
48 }
49 }
50
51 //断开SFTP
52 public void Disconnect()
53 {
54 if (Connected)
55 {
56 m_channel.disconnect();
57 m_session.disconnect();
58 }
59 }
60
61 //SFTP存放文件
62 public bool Put(string localPath, string remotePath)
63 {
64 try
65 {
66 Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath);
67 Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(remotePath);
68 m_sftp.put(src, dst);
69 return true;
70 }
71 catch
72 {
73 return false;
74 }
75 }
76
77 //SFTP获取文件
78 public bool Get(string remotePath, string localPath)
79 {
80 try
81 {
82 Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(remotePath);
83 Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);
84 m_sftp.get(src, dst);
85 return true;
86 }
87 catch
88 {
89 return false;
90 }
91 }
92 //删除SFTP文件
93 public bool Delete(string remoteFile)
94 {
95 try
96 {
97 m_sftp.rm(remoteFile);
98 return true;
99 }
100 catch
101 {
102 return false;
103 }
104 }
105
106 //获取SFTP文件列表
107 public ArrayList GetFileList(string remotePath, string fileType)
108 {
109 try
110 {
111 Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(remotePath);
112 ArrayList objList = new ArrayList();
113 foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)
114 {
115 string sss = qqq.getFilename();
116 if (sss.Length > (fileType.Length + 1) && fileType == sss.Substring(sss.Length - fileType.Length))
117 { objList.Add(sss); }
118 else { continue; }
119 }
120
121 return objList;
122 }
123 catch
124 {
125 return null;
126 }
127 }
128
129
130 //登录验证信息
131 public class MyUserInfo : UserInfo
132 {
133 String passwd;
134 public String getPassword() { return passwd; }
135 public void setPassword(String passwd) { this.passwd = passwd; }
136
137 public String getPassphrase() { return null; }
138 public bool promptPassphrase(String message) { return true; }
139
140 public bool promptPassword(String message) { return true; }
141 public bool promptYesNo(String message) { return true; }
142 public void showMessage(String message) { }
143 }
144
145
146 }
View Code |
|