FtpClient.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net;
  5. using System.Text;
  6. namespace Masuit.Tools.Net
  7. {
  8. /// <summary>
  9. /// FTP客户端操作类
  10. /// </summary>
  11. public class FtpClient
  12. {
  13. #region 变量属性
  14. /// <summary>
  15. /// Ftp服务器ip
  16. /// </summary>
  17. private string FtpServer { get; set; }
  18. /// <summary>
  19. /// Ftp 指定用户名
  20. /// </summary>
  21. private string Username { get; set; }
  22. /// <summary>
  23. /// Ftp 指定用户密码
  24. /// </summary>
  25. private string Password { get; set; }
  26. #endregion
  27. /// <summary>
  28. /// 获取一个匿名登录的ftp客户端
  29. /// </summary>
  30. /// <param name="serverIp">服务器IP地址</param>
  31. /// <returns></returns>
  32. public static FtpClient GetAnonymousClient(string serverIp)
  33. {
  34. if (!serverIp.MatchInetAddress())
  35. {
  36. throw new ArgumentException("IP地址格式不正确");
  37. }
  38. FtpClient ftpClient = new FtpClient
  39. {
  40. FtpServer = serverIp
  41. };
  42. return ftpClient;
  43. }
  44. /// <summary>
  45. /// 获取一个匿名登录的ftp客户端
  46. /// </summary>
  47. /// <param name="serverIp">服务器ip</param>
  48. /// <param name="username">用户名</param>
  49. /// <param name="password">密码</param>
  50. /// <returns></returns>
  51. public static FtpClient GetClient(string serverIp, string username, string password)
  52. {
  53. if (!serverIp.MatchInetAddress())
  54. {
  55. throw new ArgumentException("IP地址格式不正确");
  56. }
  57. FtpClient ftpClient = new FtpClient
  58. {
  59. FtpServer = serverIp,
  60. Username = username,
  61. Password = password
  62. };
  63. return ftpClient;
  64. }
  65. #region 从FTP服务器下载文件,指定本地路径和本地文件名
  66. /// <summary>
  67. /// 从FTP服务器下载文件,指定本地路径和本地文件名
  68. /// </summary>
  69. /// <param name="remoteFileName">远程文件名</param>
  70. /// <param name="localFileName">保存本地的文件名(包含路径)</param>
  71. /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
  72. /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
  73. public void Download(string remoteFileName, string localFileName, bool ifCredential = false, Action<int, int> updateProgress = null)
  74. {
  75. using (FileStream outputStream = new FileStream(localFileName, FileMode.Create))
  76. {
  77. if (FtpServer == null || FtpServer.Trim().Length == 0)
  78. {
  79. throw new Exception("ftp下载目标服务器地址未设置!");
  80. }
  81. Uri uri = new Uri("ftp://" + FtpServer + "/" + remoteFileName);
  82. var ftpsize = (FtpWebRequest)WebRequest.Create(uri);
  83. ftpsize.UseBinary = true;
  84. var reqFtp = (FtpWebRequest)WebRequest.Create(uri);
  85. reqFtp.UseBinary = true;
  86. reqFtp.KeepAlive = false;
  87. if (ifCredential) //使用用户身份认证
  88. {
  89. ftpsize.Credentials = new NetworkCredential(Username, Password);
  90. reqFtp.Credentials = new NetworkCredential(Username, Password);
  91. }
  92. ftpsize.Method = WebRequestMethods.Ftp.GetFileSize;
  93. using (FtpWebResponse re = (FtpWebResponse)ftpsize.GetResponse())
  94. {
  95. long totalBytes = re.ContentLength;
  96. reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
  97. var response = (FtpWebResponse)reqFtp.GetResponse();
  98. using (response)
  99. {
  100. var ftpStream = response.GetResponseStream();
  101. //更新进度
  102. using (ftpStream)
  103. {
  104. updateProgress?.Invoke((int)totalBytes, 0); //更新进度条
  105. long totalDownloadedByte = 0;
  106. int bufferSize = 1024 * 1024;
  107. byte[] buffer = new byte[bufferSize];
  108. if (ftpStream != null)
  109. {
  110. var readCount = ftpStream.Read(buffer, 0, bufferSize);
  111. while (readCount > 0)
  112. {
  113. totalDownloadedByte = readCount + totalDownloadedByte;
  114. outputStream.Write(buffer, 0, readCount);
  115. //更新进度
  116. updateProgress?.Invoke((int)totalBytes, (int)totalDownloadedByte); //更新进度条
  117. readCount = ftpStream.Read(buffer, 0, bufferSize);
  118. }
  119. }
  120. }
  121. }
  122. }
  123. }
  124. }
  125. /// <summary>
  126. /// 从FTP服务器下载文件,指定本地路径和本地文件名(支持断点下载)
  127. /// </summary>
  128. /// <param name="remoteFileName">远程文件名</param>
  129. /// <param name="localFileName">保存本地的文件名(包含路径)</param>
  130. /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
  131. /// <param name="size">已下载文件流大小</param>
  132. /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
  133. public void BrokenDownload(string remoteFileName, string localFileName, bool ifCredential, long size, Action<int, int> updateProgress = null)
  134. {
  135. using (FileStream outputStream = new FileStream(localFileName, FileMode.Append))
  136. {
  137. if (FtpServer == null || FtpServer.Trim().Length == 0)
  138. {
  139. throw new Exception("ftp下载目标服务器地址未设置!");
  140. }
  141. Uri uri = new Uri("ftp://" + FtpServer + "/" + remoteFileName);
  142. var ftpsize = (FtpWebRequest)WebRequest.Create(uri);
  143. ftpsize.UseBinary = true;
  144. ftpsize.ContentOffset = size;
  145. var reqFtp = (FtpWebRequest)WebRequest.Create(uri);
  146. reqFtp.UseBinary = true;
  147. reqFtp.KeepAlive = false;
  148. reqFtp.ContentOffset = size;
  149. if (ifCredential) //使用用户身份认证
  150. {
  151. ftpsize.Credentials = new NetworkCredential(Username, Password);
  152. reqFtp.Credentials = new NetworkCredential(Username, Password);
  153. }
  154. ftpsize.Method = WebRequestMethods.Ftp.GetFileSize;
  155. using (FtpWebResponse re = (FtpWebResponse)ftpsize.GetResponse())
  156. {
  157. var totalBytes = re.ContentLength;
  158. reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
  159. using (var response = (FtpWebResponse)reqFtp.GetResponse())
  160. {
  161. using (var ftpStream = response.GetResponseStream())
  162. {
  163. updateProgress?.Invoke((int)totalBytes, 0); //更新进度条
  164. long totalDownloadedByte = 0;
  165. int bufferSize = 1024 * 1024;
  166. byte[] buffer = new byte[bufferSize];
  167. if (ftpStream != null)
  168. {
  169. var readCount = ftpStream.Read(buffer, 0, bufferSize);
  170. while (readCount > 0)
  171. {
  172. totalDownloadedByte = readCount + totalDownloadedByte;
  173. outputStream.Write(buffer, 0, readCount);
  174. //更新进度
  175. updateProgress?.Invoke((int)totalBytes, (int)totalDownloadedByte); //更新进度条
  176. readCount = ftpStream.Read(buffer, 0, bufferSize);
  177. }
  178. }
  179. }
  180. }
  181. }
  182. }
  183. }
  184. /// <summary>
  185. /// 从FTP服务器下载文件,指定本地路径和本地文件名
  186. /// </summary>
  187. /// <param name="remoteFileName">远程文件名</param>
  188. /// <param name="localFileName">保存本地的文件名(包含路径)</param>
  189. /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
  190. /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
  191. /// <param name="brokenOpen">是否断点下载:true 会在localFileName 找是否存在已经下载的文件,并计算文件流大小</param>
  192. public void Download(string remoteFileName, string localFileName, bool ifCredential, bool brokenOpen, Action<int, int> updateProgress = null)
  193. {
  194. if (brokenOpen)
  195. {
  196. long size = 0;
  197. if (File.Exists(localFileName))
  198. {
  199. using (FileStream outputStream = new FileStream(localFileName, FileMode.Open))
  200. {
  201. size = outputStream.Length;
  202. }
  203. }
  204. BrokenDownload(remoteFileName, localFileName, ifCredential, size, updateProgress);
  205. }
  206. Download(remoteFileName, localFileName, ifCredential, updateProgress);
  207. }
  208. #endregion
  209. #region 上传文件到FTP服务器
  210. /// <summary>
  211. /// 上传文件到FTP服务器
  212. /// </summary>
  213. /// <param name="relativePath">相对目录</param>
  214. /// <param name="localFullPathName">本地带有完整路径的文件名</param>
  215. /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
  216. public void UploadFile(string relativePath, string localFullPathName, Action<int, int> updateProgress = null)
  217. {
  218. FileInfo finfo = new FileInfo(localFullPathName);
  219. if (FtpServer == null || FtpServer.Trim().Length == 0)
  220. {
  221. throw new Exception("ftp上传目标服务器地址未设置!");
  222. }
  223. Uri uri = new Uri("ftp://" + FtpServer + "/" + relativePath + "/" + finfo.Name);
  224. var reqFtp = (FtpWebRequest)WebRequest.Create(uri);
  225. reqFtp.KeepAlive = false;
  226. reqFtp.UseBinary = true;
  227. reqFtp.Credentials = new NetworkCredential(Username, Password); //用户,密码
  228. reqFtp.Method = WebRequestMethods.Ftp.UploadFile; //向服务器发出下载请求命令
  229. reqFtp.ContentLength = finfo.Length; //为request指定上传文件的大小
  230. int buffLength = 1024 * 1024;
  231. byte[] buff = new byte[buffLength];
  232. using (var fs = finfo.OpenRead())
  233. {
  234. using (var stream = reqFtp.GetRequestStream())
  235. {
  236. var contentLen = fs.Read(buff, 0, buffLength);
  237. int allbye = (int)finfo.Length;
  238. //更新进度
  239. updateProgress?.Invoke(allbye, 0); //更新进度条
  240. int startbye = 0;
  241. while (contentLen != 0)
  242. {
  243. startbye = contentLen + startbye;
  244. stream.Write(buff, 0, contentLen);
  245. //更新进度
  246. updateProgress?.Invoke(allbye, startbye); //更新进度条
  247. contentLen = fs.Read(buff, 0, buffLength);
  248. }
  249. }
  250. }
  251. }
  252. /// <summary>
  253. /// 上传文件到FTP服务器(断点续传)
  254. /// </summary>
  255. /// <param name="localFullPath">本地文件全路径名称:C:\Users\JianKunKing\Desktop\IronPython脚本测试工具</param>
  256. /// <param name="remoteFilepath">远程文件所在文件夹路径</param>
  257. /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
  258. /// <returns></returns>
  259. public bool UploadBroken(string localFullPath, string remoteFilepath, Action<int, int> updateProgress = null)
  260. {
  261. if (remoteFilepath == null)
  262. {
  263. remoteFilepath = "";
  264. }
  265. string newFileName;
  266. FileInfo fileInf = new FileInfo(localFullPath);
  267. long allbye = fileInf.Length;
  268. if (fileInf.Name.IndexOf("#", StringComparison.Ordinal) == -1)
  269. {
  270. newFileName = RemoveSpaces(fileInf.Name);
  271. }
  272. else
  273. {
  274. newFileName = fileInf.Name.Replace("#", "#");
  275. newFileName = RemoveSpaces(newFileName);
  276. }
  277. long startfilesize = GetFileSize(newFileName, remoteFilepath);
  278. if (startfilesize >= allbye)
  279. {
  280. return false;
  281. }
  282. long startbye = startfilesize;
  283. //更新进度
  284. updateProgress?.Invoke((int)allbye, (int)startfilesize); //更新进度条
  285. string uri;
  286. if (remoteFilepath.Length == 0)
  287. {
  288. uri = "ftp://" + FtpServer + "/" + newFileName;
  289. }
  290. else
  291. {
  292. uri = "ftp://" + FtpServer + "/" + remoteFilepath + "/" + newFileName;
  293. }
  294. // 根据uri创建FtpWebRequest对象
  295. var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(uri));
  296. // ftp用户名和密码
  297. reqFtp.Credentials = new NetworkCredential(Username, Password);
  298. // 默认为true,连接不会被关闭
  299. // 在一个命令之后被执行
  300. reqFtp.KeepAlive = false;
  301. // 指定执行什么命令
  302. reqFtp.Method = WebRequestMethods.Ftp.AppendFile;
  303. // 指定数据传输类型
  304. reqFtp.UseBinary = true;
  305. // 上传文件时通知服务器文件的大小
  306. reqFtp.ContentLength = fileInf.Length;
  307. int buffLength = 1024 * 1024; // 缓冲大小设置为2kb
  308. byte[] buff = new byte[buffLength];
  309. // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
  310. using (FileStream fs = fileInf.OpenRead())
  311. {
  312. using (var strm = reqFtp.GetRequestStream())
  313. {
  314. // 把上传的文件写入流
  315. fs.Seek(startfilesize, 0);
  316. int contentLen = fs.Read(buff, 0, buffLength);
  317. // 流内容没有结束
  318. while (contentLen != 0)
  319. {
  320. // 把内容从file stream 写入 upload stream
  321. strm.Write(buff, 0, contentLen);
  322. contentLen = fs.Read(buff, 0, buffLength);
  323. startbye += contentLen;
  324. //更新进度
  325. updateProgress?.Invoke((int)allbye, (int)startbye); //更新进度条
  326. }
  327. }
  328. }
  329. return true;
  330. }
  331. /// <summary>
  332. /// 去除空格
  333. /// </summary>
  334. /// <param name="str"></param>
  335. /// <returns></returns>
  336. private string RemoveSpaces(string str)
  337. {
  338. string a = "";
  339. foreach (char c in str)
  340. {
  341. var array = Encoding.ASCII.GetBytes(c.ToString());
  342. int asciicode = array[0];
  343. if (asciicode != 32)
  344. {
  345. a += c.ToString();
  346. }
  347. }
  348. return a.Split('.')[a.Split('.').Length - 2] + "." + a.Split('.')[a.Split('.').Length - 1];
  349. }
  350. /// <summary>
  351. /// 获取已上传文件大小
  352. /// </summary>
  353. /// <param name="filePath">文件名称</param>
  354. /// <param name="remoteFilepath">服务器文件路径</param>
  355. /// <returns></returns>
  356. public long GetFileSize(string filePath, string remoteFilepath)
  357. {
  358. try
  359. {
  360. FileInfo fi = new FileInfo(filePath);
  361. string uri;
  362. if (remoteFilepath.Length == 0)
  363. {
  364. uri = "ftp://" + FtpServer + "/" + fi.Name;
  365. }
  366. else
  367. {
  368. uri = "ftp://" + FtpServer + "/" + remoteFilepath + "/" + fi.Name;
  369. }
  370. var reqFtp = (FtpWebRequest)WebRequest.Create(uri);
  371. reqFtp.KeepAlive = false;
  372. reqFtp.UseBinary = true;
  373. reqFtp.Credentials = new NetworkCredential(Username, Password); //用户,密码
  374. reqFtp.Method = WebRequestMethods.Ftp.GetFileSize;
  375. FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse();
  376. var filesize = response.ContentLength;
  377. return filesize;
  378. }
  379. catch
  380. {
  381. return 0;
  382. }
  383. }
  384. #endregion
  385. #region 获取当前目录下明细
  386. /// <summary>
  387. /// 获取当前目录下明细(包含文件和文件夹)
  388. /// </summary>
  389. /// <returns></returns>
  390. public List<string> GetFilesDetails(string relativePath = "")
  391. {
  392. List<string> result = new List<string>();
  393. var ftp = (FtpWebRequest)WebRequest.Create(new Uri(Path.Combine("ftp://" + FtpServer, relativePath).Replace("\\", "/")));
  394. ftp.Credentials = new NetworkCredential(Username, Password);
  395. ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
  396. using (WebResponse response = ftp.GetResponse())
  397. {
  398. using (StreamReader reader = new StreamReader(response.GetResponseStream() ?? throw new InvalidOperationException(), Encoding.UTF8))
  399. {
  400. string line = reader.ReadLine();
  401. while (line != null)
  402. {
  403. result.Add(line);
  404. line = reader.ReadLine();
  405. }
  406. }
  407. }
  408. return result;
  409. }
  410. /// <summary>
  411. /// 获取当前目录下文件列表(仅文件)
  412. /// </summary>
  413. /// <returns></returns>
  414. public List<string> GetFiles(string relativePath = "", string mask = "*.*")
  415. {
  416. var result = new List<string>();
  417. var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(Path.Combine("ftp://" + FtpServer, relativePath).Replace("\\", "/")));
  418. reqFtp.UseBinary = true;
  419. reqFtp.Credentials = new NetworkCredential(Username, Password);
  420. reqFtp.Method = WebRequestMethods.Ftp.ListDirectory;
  421. using (WebResponse response = reqFtp.GetResponse())
  422. {
  423. using (StreamReader reader = new StreamReader(response.GetResponseStream() ?? throw new InvalidOperationException(), Encoding.UTF8))
  424. {
  425. string line = reader.ReadLine();
  426. while (line != null)
  427. {
  428. if (mask.Trim() != string.Empty && mask.Trim() != "*.*")
  429. {
  430. string temp = mask.Substring(0, mask.IndexOf("*", StringComparison.Ordinal));
  431. if (line.Substring(0, temp.Length) == temp)
  432. {
  433. result.Add(line);
  434. }
  435. }
  436. else
  437. {
  438. result.Add(line);
  439. }
  440. line = reader.ReadLine();
  441. }
  442. }
  443. }
  444. return result;
  445. }
  446. /// <summary>
  447. /// 获取当前目录下所有的文件夹列表(仅文件夹)
  448. /// </summary>
  449. /// <returns></returns>
  450. public string[] GetDirectories(string relativePath)
  451. {
  452. var drectory = GetFilesDetails(relativePath);
  453. string m = string.Empty;
  454. foreach (string str in drectory)
  455. {
  456. int dirPos = str.IndexOf("<DIR>", StringComparison.Ordinal);
  457. if (dirPos > 0)
  458. {
  459. /*判断 Windows 风格*/
  460. m += str.Substring(dirPos + 5).Trim() + "\n";
  461. }
  462. else if (str.Trim().StartsWith("d"))
  463. {
  464. /*判断 Unix 风格*/
  465. string dir = str.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)[8];
  466. if (dir != "." && dir != "..")
  467. {
  468. dir = str.Substring(str.IndexOf(dir, StringComparison.Ordinal));
  469. m += dir + "\n";
  470. }
  471. }
  472. }
  473. char[] n =
  474. {
  475. '\n'
  476. };
  477. return m.Split(n);
  478. }
  479. #endregion
  480. #region 删除文件及文件夹
  481. /// <summary>
  482. /// 删除文件
  483. /// </summary>
  484. /// <param name="filePath"></param>
  485. public void Delete(string filePath)
  486. {
  487. string uri = Path.Combine("ftp://" + FtpServer, filePath).Replace("\\", "/");
  488. var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(uri));
  489. reqFtp.Credentials = new NetworkCredential(Username, Password);
  490. reqFtp.KeepAlive = false;
  491. reqFtp.Method = WebRequestMethods.Ftp.DeleteFile;
  492. using (FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse())
  493. {
  494. using (Stream datastream = response.GetResponseStream())
  495. {
  496. using (StreamReader sr = new StreamReader(datastream ?? throw new InvalidOperationException()))
  497. {
  498. sr.ReadToEnd();
  499. }
  500. }
  501. }
  502. }
  503. /// <summary>
  504. /// 删除文件夹
  505. /// </summary>
  506. /// <param name="dirPath"></param>
  507. public void RemoveDirectory(string dirPath)
  508. {
  509. string uri = Path.Combine("ftp://" + FtpServer, dirPath).Replace("\\", "/");
  510. var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(uri));
  511. reqFtp.Credentials = new NetworkCredential(Username, Password);
  512. reqFtp.KeepAlive = false;
  513. reqFtp.Method = WebRequestMethods.Ftp.RemoveDirectory;
  514. using (FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse())
  515. {
  516. using (Stream datastream = response.GetResponseStream())
  517. {
  518. using (StreamReader sr = new StreamReader(datastream ?? throw new InvalidOperationException()))
  519. {
  520. sr.ReadToEnd();
  521. }
  522. }
  523. }
  524. }
  525. #endregion
  526. #region 其他操作
  527. /// <summary>
  528. /// 获取指定文件大小
  529. /// </summary>
  530. /// <param name="filePath"></param>
  531. /// <returns></returns>
  532. public long GetFileSize(string filePath)
  533. {
  534. var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(Path.Combine("ftp://" + FtpServer, filePath).Replace("\\", "/")));
  535. reqFtp.Method = WebRequestMethods.Ftp.GetFileSize;
  536. reqFtp.UseBinary = true;
  537. reqFtp.Credentials = new NetworkCredential(Username, Password);
  538. using (FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse())
  539. {
  540. var fileSize = response.ContentLength;
  541. return fileSize;
  542. }
  543. }
  544. /// <summary>
  545. /// 判断当前目录下指定的子目录是否存在
  546. /// </summary>
  547. /// <param name="remoteDirPath">指定的目录名</param>
  548. public bool DirectoryExist(string remoteDirPath)
  549. {
  550. try
  551. {
  552. string[] dirList = GetDirectories(remoteDirPath);
  553. foreach (string str in dirList)
  554. {
  555. if (str.Trim() == remoteDirPath.Trim())
  556. {
  557. return true;
  558. }
  559. }
  560. return false;
  561. }
  562. catch
  563. {
  564. return false;
  565. }
  566. }
  567. /// <summary>
  568. /// 判断当前目录下指定的文件是否存在
  569. /// </summary>
  570. /// <param name="remoteFileName">远程文件名</param>
  571. public bool FileExist(string remoteFileName)
  572. {
  573. var fileList = GetFiles("*.*");
  574. foreach (string str in fileList)
  575. {
  576. if (str.Trim() == remoteFileName.Trim())
  577. {
  578. return true;
  579. }
  580. }
  581. return false;
  582. }
  583. /// <summary>
  584. /// 创建文件夹
  585. /// </summary>
  586. /// <param name="relativePath">路径</param>
  587. /// <param name="newDir">新建文件夹</param>
  588. public void MakeDir(string relativePath, string newDir)
  589. {
  590. // dirName = name of the directory to create.
  591. var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(Path.Combine("ftp://" + FtpServer, relativePath, newDir).Replace("\\", "/")));
  592. reqFtp.Method = WebRequestMethods.Ftp.MakeDirectory;
  593. reqFtp.UseBinary = true;
  594. reqFtp.Credentials = new NetworkCredential(Username, Password);
  595. using (FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse())
  596. {
  597. using (response.GetResponseStream())
  598. {
  599. }
  600. }
  601. }
  602. /// <summary>
  603. /// 改名
  604. /// </summary>
  605. /// <param name="relativePath">相对路径</param>
  606. /// <param name="currentFilename"></param>
  607. /// <param name="newFilename"></param>
  608. public void Rename(string relativePath, string currentFilename, string newFilename)
  609. {
  610. var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(Path.Combine("ftp://" + FtpServer, relativePath, currentFilename).Replace("\\", "/")));
  611. reqFtp.Method = WebRequestMethods.Ftp.Rename;
  612. reqFtp.RenameTo = newFilename;
  613. reqFtp.UseBinary = true;
  614. reqFtp.Credentials = new NetworkCredential(Username, Password);
  615. using (FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse())
  616. {
  617. using (response.GetResponseStream())
  618. {
  619. }
  620. }
  621. }
  622. /// <summary>
  623. /// 移动文件
  624. /// </summary>
  625. /// <param name="relativePath">相对路径</param>
  626. /// <param name="currentFilename"></param>
  627. /// <param name="newDirectory"></param>
  628. public void MoveFile(string relativePath, string currentFilename, string newDirectory)
  629. {
  630. Rename(relativePath, currentFilename, newDirectory);
  631. }
  632. #endregion
  633. }
  634. }