ftp下载目录下所有文件及文件夹内(递归)

 
  1. /// <summary>
  2. /// ftp文件上传、下载操作类
  3. /// </summary>
  4. public class FTPHelper
  5. {
  6.  
  7. /// <summary>
  8. /// ftp用户名,匿名为“”
  9. /// </summary>
  10. private string ftpUser;
  11.  
  12. /// <summary>
  13. /// ftp用户密码,匿名为“”
  14. /// </summary>
  15. private string ftpPassWord;
  16.  
  17. /// <summary>
  18. ///通过用户名,密码连接到FTP服务器
  19. /// </summary>
  20. /// <param name="ftpUser">ftp用户名,匿名为“”</param>
  21. /// <param name="ftpPassWord">ftp登陆密码,匿名为“”</param>
  22. public FTPHelper(string ftpUser, string ftpPassWord)
  23. {
  24. this.ftpUser = ftpUser;
  25. this.ftpPassWord = ftpPassWord;
  26. }
  27.  
  28. /// <summary>
  29. /// 匿名访问
  30. /// </summary>
  31. public FTPHelper()
  32. {
  33. this.ftpUser = "";
  34. this.ftpPassWord = "";
  35. }
  36.  
  37. /// <summary>
  38. /// 上传文件到Ftp服务器
  39. /// </summary>
  40. /// <param name="uri">把上传的文件保存为ftp服务器文件的uri,如"ftp://192.168.1.104/capture-212.avi"</param>
  41. /// <param name="upLoadFile">要上传的本地的文件路径,如D:\capture-2.avi</param>
  42. public void UpLoadFile(string UpLoadUri, string upLoadFile)
  43. {
  44. Stream requestStream = null;
  45. FileStream fileStream = null;
  46. FtpWebResponse uploadResponse = null;
  47.  
  48. try
  49. {
  50. Uri uri = new Uri(UpLoadUri);
  51.  
  52. FtpWebRequest uploadRequest = (FtpWebRequest)WebRequest.Create(uri);
  53. uploadRequest.Method = WebRequestMethods.Ftp.UploadFile;
  54.  
  55. uploadRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
  56.  
  57. requestStream = uploadRequest.GetRequestStream();
  58. fileStream = File.Open(upLoadFile, FileMode.Open);
  59.  
  60. byte[] buffer = new byte[1024];
  61. int bytesRead;
  62. while (true)
  63. {
  64. bytesRead = fileStream.Read(buffer, 0, buffer.Length);
  65. if (bytesRead == 0)
  66. break;
  67. requestStream.Write(buffer, 0, bytesRead);
  68. }
  69.  
  70. requestStream.Close();
  71.  
  72. uploadResponse = (FtpWebResponse)uploadRequest.GetResponse();
  73.  
  74. }
  75. catch (Exception ex)
  76. {
  77. throw new Exception("上传文件到ftp服务器出错,文件名:" + upLoadFile + "异常信息:" + ex.ToString());
  78. }
  79. finally
  80. {
  81. if (uploadResponse != null)
  82. uploadResponse.Close();
  83. if (fileStream != null)
  84. fileStream.Close();
  85. if (requestStream != null)
  86. requestStream.Close();
  87. }
  88. }
  89.  
  90. /// <summary>
  91. /// 从ftp下载文件到本地服务器
  92. /// </summary>
  93. /// <param name="downloadUrl">要下载的ftp文件路径,如ftp://192.168.1.104/capture-2.avi</param>
  94. /// <param name="saveFileUrl">本地保存文件的路径,如(@"d:\capture-22.avi"</param>
  95. public void DownLoadFile(string downloadUrl, string saveFileUrl)
  96. {
  97. Stream responseStream = null;
  98. FileStream fileStream = null;
  99. StreamReader reader = null;
  100.  
  101. try
  102. {
  103. // string downloadUrl = "ftp://192.168.1.104/capture-2.avi";
  104.  
  105. FtpWebRequest downloadRequest = (FtpWebRequest)WebRequest.Create(downloadUrl);
  106. downloadRequest.Method = WebRequestMethods.Ftp.DownloadFile;
  107.  
  108. //string ftpUser = "yoyo";
  109. //string ftpPassWord = "123456";
  110. downloadRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
  111.  
  112. FtpWebResponse downloadResponse = (FtpWebResponse)downloadRequest.GetResponse();
  113. responseStream = downloadResponse.GetResponseStream();
  114.  
  115. fileStream = File.Create(saveFileUrl);
  116. byte[] buffer = new byte[1024];
  117. int bytesRead;
  118. while (true)
  119. {
  120. bytesRead = responseStream.Read(buffer, 0, buffer.Length);
  121. if (bytesRead == 0)
  122. break;
  123. fileStream.Write(buffer, 0, bytesRead);
  124. }
  125. }
  126. catch (Exception ex)
  127. {
  128. throw new Exception("从ftp服务器下载文件出错,文件名:" + downloadUrl + "异常信息:" + ex.ToString());
  129. }
  130. finally
  131. {
  132. if (reader != null)
  133. {
  134. reader.Close();
  135. }
  136. if (responseStream != null)
  137. {
  138. responseStream.Close();
  139. }
  140. if (fileStream != null)
  141. {
  142. fileStream.Close();
  143. }
  144. }
  145. }
  146.  
  147. /// <summary>
  148. /// 从FTP下载文件到本地服务器,支持断点下载
  149. /// </summary>
  150. /// <param name="ftpUri">ftp文件路径,如"ftp://localhost/test.txt"</param>
  151. /// <param name="saveFile">保存文件的路径,如C:\\test.txt</param>
  152. public void BreakPointDownLoadFile(string ftpUri, string saveFile)
  153. {
  154. System.IO.FileStream fs = null;
  155. System.Net.FtpWebResponse ftpRes = null;
  156. System.IO.Stream resStrm = null;
  157. try
  158. {
  159. //下载文件的URI
  160. Uri u = new Uri(ftpUri);
  161. //设定下载文件的保存路径
  162. string downFile = saveFile;
  163.  
  164. //FtpWebRequest的作成
  165. System.Net.FtpWebRequest ftpReq = (System.Net.FtpWebRequest)
  166. System.Net.WebRequest.Create(u);
  167. //设定用户名和密码
  168. ftpReq.Credentials = new System.Net.NetworkCredential(ftpUser, ftpPassWord);
  169. //MethodにWebRequestMethods.Ftp.DownloadFile("RETR")设定
  170. ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
  171. //要求终了后关闭连接
  172. ftpReq.KeepAlive = false;
  173. //使用ASCII方式传送
  174. ftpReq.UseBinary = false;
  175. //设定PASSIVE方式无效
  176. ftpReq.UsePassive = false;
  177.  
  178. //判断是否继续下载
  179. //继续写入下载文件的FileStream
  180.  
  181. if (System.IO.File.Exists(downFile))
  182. {
  183. //继续下载
  184. ftpReq.ContentOffset = (new System.IO.FileInfo(downFile)).Length;
  185. fs = new System.IO.FileStream(
  186. downFile, System.IO.FileMode.Append, System.IO.FileAccess.Write);
  187. }
  188. else
  189. {
  190. //一般下载
  191. fs = new System.IO.FileStream(
  192. downFile, System.IO.FileMode.Create, System.IO.FileAccess.Write);
  193. }
  194.  
  195. //取得FtpWebResponse
  196. ftpRes = (System.Net.FtpWebResponse)ftpReq.GetResponse();
  197. //为了下载文件取得Stream
  198. resStrm = ftpRes.GetResponseStream();
  199. //写入下载的数据
  200. byte[] buffer = new byte[1024];
  201. while (true)
  202. {
  203. int readSize = resStrm.Read(buffer, 0, buffer.Length);
  204. if (readSize == 0)
  205. break;
  206. fs.Write(buffer, 0, readSize);
  207. }
  208. }
  209. catch (Exception ex)
  210. {
  211. throw new Exception("从ftp服务器下载文件出错,文件名:" + ftpUri + "异常信息:" + ex.ToString());
  212. }
  213. finally
  214. {
  215. fs.Close();
  216. resStrm.Close();
  217. ftpRes.Close();
  218. }
  219. }
  220.  
  221. #region 从FTP上下载整个文件夹,包括文件夹下的文件和文件夹
  222.  
  223. /// <summary>
  224. /// 列出FTP服务器上面当前目录的所有文件和目录
  225. /// </summary>
  226. /// <param name="ftpUri">FTP目录</param>
  227. /// <returns></returns>
  228. public List<FileStruct> ListFilesAndDirectories(string ftpUri)
  229. {
  230. WebResponse webresp = null;
  231. StreamReader ftpFileListReader = null;
  232. FtpWebRequest ftpRequest = null;
  233. try
  234. {
  235. ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpUri));
  236. ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
  237. ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
  238. webresp = ftpRequest.GetResponse();
  239. ftpFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.Default);
  240. }
  241. catch (Exception ex)
  242. {
  243. throw new Exception("获取文件列表出错,错误信息如下:" + ex.ToString());
  244. }
  245. string Datastring = ftpFileListReader.ReadToEnd();
  246. return GetList(Datastring);
  247.  
  248. }
  249.  
  250. /// <summary>
  251. /// 列出FTP目录下的所有文件
  252. /// </summary>
  253. /// <param name="ftpUri">FTP目录</param>
  254. /// <returns></returns>
  255. public List<FileStruct> ListFiles(string ftpUri)
  256. {
  257. List<FileStruct> listAll = ListFilesAndDirectories(ftpUri);
  258. List<FileStruct> listFile = new List<FileStruct>();
  259. foreach (FileStruct file in listAll)
  260. {
  261. if (!file.IsDirectory)
  262. {
  263. listFile.Add(file);
  264. }
  265. }
  266. return listFile;
  267. }
  268.  
  269. /// <summary>
  270. /// 列出FTP目录下的所有目录
  271. /// </summary>
  272. /// <param name="ftpUri">FRTP目录</param>
  273. /// <returns>目录列表</returns>
  274. public List<FileStruct> ListDirectories(string ftpUri)
  275. {
  276. List<FileStruct> listAll = ListFilesAndDirectories(ftpUri);
  277. List<FileStruct> listDirectory = new List<FileStruct>();
  278. foreach (FileStruct file in listAll)
  279. {
  280. if (file.IsDirectory)
  281. {
  282. listDirectory.Add(file);
  283. }
  284. }
  285. return listDirectory;
  286. }
  287.  
  288. /// <summary>
  289. /// 获得文件和目录列表
  290. /// </summary>
  291. /// <param name="datastring">FTP返回的列表字符信息</param>
  292. private List<FileStruct> GetList(string datastring)
  293. {
  294. List<FileStruct> myListArray = new List<FileStruct>();
  295. string[] dataRecords = datastring.Split('\n');
  296. FileListStyle _directoryListStyle = GuessFileListStyle(dataRecords);
  297. foreach (string s in dataRecords)
  298. {
  299. if (_directoryListStyle != FileListStyle.Unknown && s != "")
  300. {
  301. FileStruct f = new FileStruct();
  302. f.Name = "..";
  303. switch (_directoryListStyle)
  304. {
  305. case FileListStyle.UnixStyle:
  306. f = ParseFileStructFromUnixStyleRecord(s);
  307. break;
  308. case FileListStyle.WindowsStyle:
  309. f = ParseFileStructFromWindowsStyleRecord(s);
  310. break;
  311. }
  312. if (!(f.Name == "." || f.Name == ".."))
  313. {
  314. myListArray.Add(f);
  315. }
  316. }
  317. }
  318. return myListArray;
  319. }
  320. /// <summary>
  321. /// 从Unix格式中返回文件信息
  322. /// </summary>
  323. /// <param name="Record">文件信息</param>
  324. private FileStruct ParseFileStructFromUnixStyleRecord(string Record)
  325. {
  326. FileStruct f = new FileStruct();
  327. string processstr = Record.Trim();
  328. f.Flags = processstr.Substring(0, 10);
  329. f.IsDirectory = (f.Flags[0] == 'd');
  330. processstr = (processstr.Substring(11)).Trim();
  331. _cutSubstringFromStringWithTrim(ref processstr, ' ', 0); //跳过一部分
  332. f.Owner = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
  333. f.Group = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
  334. _cutSubstringFromStringWithTrim(ref processstr, ' ', 0); //跳过一部分
  335. string yearOrTime = processstr.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[2];
  336. if (yearOrTime.IndexOf(":") >= 0) //time
  337. {
  338. processstr = processstr.Replace(yearOrTime, DateTime.Now.Year.ToString());
  339. }
  340. f.CreateTime = DateTime.Parse(_cutSubstringFromStringWithTrim(ref processstr, ' ', 8));
  341. f.Name = processstr; //最后就是名称
  342. return f;
  343. }
  344.  
  345. /// <summary>
  346. /// 从Windows格式中返回文件信息
  347. /// </summary>
  348. /// <param name="Record">文件信息</param>
  349. private FileStruct ParseFileStructFromWindowsStyleRecord(string Record)
  350. {
  351. FileStruct f = new FileStruct();
  352. string processstr = Record.Trim();
  353. string dateStr = processstr.Substring(0, 8);
  354. processstr = (processstr.Substring(8, processstr.Length - 8)).Trim();
  355. string timeStr = processstr.Substring(0, 7);
  356. processstr = (processstr.Substring(7, processstr.Length - 7)).Trim();
  357. DateTimeFormatInfo myDTFI = new CultureInfo("en-US", false).DateTimeFormat;
  358. myDTFI.ShortTimePattern = "t";
  359. f.CreateTime = DateTime.Parse(dateStr + " " + timeStr, myDTFI);
  360. if (processstr.Substring(0, 5) == "<DIR>")
  361. {
  362. f.IsDirectory = true;
  363. processstr = (processstr.Substring(5, processstr.Length - 5)).Trim();
  364. }
  365. else
  366. {
  367. string[] strs = processstr.Split(new char[] { ' ' },2);// StringSplitOptions.RemoveEmptyEntries); // true);
  368. processstr = strs[1];
  369. f.IsDirectory = false;
  370. }
  371. f.Name = processstr;
  372. return f;
  373. }
  374. /// <summary>
  375. /// 按照一定的规则进行字符串截取
  376. /// </summary>
  377. /// <param name="s">截取的字符串</param>
  378. /// <param name="c">查找的字符</param>
  379. /// <param name="startIndex">查找的位置</param>
  380. private string _cutSubstringFromStringWithTrim(ref string s, char c, int startIndex)
  381. {
  382. int pos1 = s.IndexOf(c, startIndex);
  383. string retString = s.Substring(0, pos1);
  384. s = (s.Substring(pos1)).Trim();
  385. return retString;
  386. }
  387. /// <summary>
  388. /// 判断文件列表的方式Window方式还是Unix方式
  389. /// </summary>
  390. /// <param name="recordList">文件信息列表</param>
  391. private FileListStyle GuessFileListStyle(string[] recordList)
  392. {
  393. foreach (string s in recordList)
  394. {
  395. if (s.Length > 10
  396. && Regex.IsMatch(s.Substring(0, 10), "(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)"))
  397. {
  398. return FileListStyle.UnixStyle;
  399. }
  400. else if (s.Length > 8
  401. && Regex.IsMatch(s.Substring(0, 8), "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"))
  402. {
  403. return FileListStyle.WindowsStyle;
  404. }
  405. }
  406. return FileListStyle.Unknown;
  407. }
  408.  
  409. /// <summary>
  410. /// 从FTP下载整个文件夹
  411. /// </summary>
  412. /// <param name="ftpDir">FTP文件夹路径</param>
  413. /// <param name="saveDir">保存的本地文件夹路径</param>
  414. public void DownFtpDir(string ftpDir, string saveDir)
  415. {
  416. List<FileStruct> files = ListFilesAndDirectories(ftpDir);
  417. if (!Directory.Exists(saveDir))
  418. {
  419. Directory.CreateDirectory(saveDir);
  420. }
  421. foreach (FileStruct f in files)
  422. {
  423. if (f.IsDirectory) //文件夹,递归查询
  424. {
  425. DownFtpDir(ftpDir + "/" + f.Name, saveDir + "\\" + f.Name);
  426. }
  427. else //文件,直接下载
  428. {
  429. DownLoadFile(ftpDir + "/" + f.Name, saveDir + "\\" + f.Name);
  430. }
  431. }
  432. }
  433.  
  434. #endregion
  435. }
  436.  
  437. #region 文件信息结构
  438. public struct FileStruct
  439. {
  440. public string Flags;
  441. public string Owner;
  442. public string Group;
  443. public bool IsDirectory;
  444. public DateTime CreateTime;
  445. public string Name;
  446. }
  447. public enum FileListStyle
  448. {
  449. UnixStyle,
  450. WindowsStyle,
  451. Unknown
  452. }
  453. #endregion

ftp下载目录下所有文件及文件夹内(递归)的更多相关文章

  1. ftp下载目录文件 不需要ftp脚本

    ftp下载目录文件 不需要ftp脚本 wget ftp://192.168.1.37:21/checkpoints --ftp-user=ftpadmin --ftp-password=gaofeng ...

  2. Centos7安装nginx后提示“Welcome to nginx on Fedora!”,conf.d目录下无default.conf文件

    问题描述 在腾讯云centos7上安装nginx sudo yum install nginx 打开默认网页显示 Welcome to nginx on Fedora! 且 /etc/nginx/co ...

  3. 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本

    摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 ...

  4. gen目录无法更新,或者gen目录下的R.JAVA文件无法生成

    gen目录无法更新,或者gen目录下的R.JAVA文件无法生成 1.gen目录的用处 android gen目录下的R.java并不是由用户创建,而是android工程本身将android的资源进行自 ...

  5. php源码之遍历目录下的所有的文件

    <?php //遍历目录下的所有的文件 -- 递归调用 // http://www.manongjc.com/article/1495.html function get_all_file1($ ...

  6. Python实现插件机制——自动import一个目录下的所有.py文件

    假设有这样一个目录结构: /src          main.py          /plugins                __init__.py                a.py  ...

  7. 使用 NIO.2 遍历目录下所有的Java文件

    package wellGrounded; import java.io.IOException; import java.nio.file.FileVisitResult; import java. ...

  8. java 提取目录下所有子目录的文件到指定位置

    package folder; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundExcept ...

  9. 检测某一目录下md5相同的文件

    import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.IOUtils; import jav ...

随机推荐

  1. Win7 64位 VS2015环境使用qt-msvc2015-5.6.0

    QT下载 http://www.qt.io/download-open-source/#section-2 我用的是 qt-opensource-windows-x86-msvc2015-5.6.0. ...

  2. React Native填坑之旅--重新认识RN

    如同黑夜里的一道光一样,就这么知道了F8. F8是每年一次Facebook每年一次的开发者大会.每次大会都会release相应的APP,iOS.Android都有.之前都是用Native开发的,但是2 ...

  3. 使用TableViewRow完成下拉菜单效果

    在TableViewRow标签中增加一个属性opened(自己定义的)=true or false 用于标记当前row的状态 ​    ​然后用table_view.deleteRow()方法  参数 ...

  4. SIFT中的尺度空间和传统图像金字塔

    SIFT中的尺度空间和传统图像金字塔 http://www.zhizhihu.com/html/y2010/2146.html 最近自己混淆了好多概念,一边弄明白的同时,也做了一些记录,分享一下.最近 ...

  5. Software Project Management hw1

    I just want to say something about my java project that I did last year. Our task is to finish a lin ...

  6. 张洋:浅析PageRank算法

    本文引自http://blog.jobbole.com/23286/ 很早就对Google的PageRank算法很感兴趣,但一直没有深究,只有个轮廓性的概念.前几天趁团队outing的机会,在动车上看 ...

  7. vs2010中的MSBuild输出warning MSB8012问题

    vs2010中,MSBuild与C++编译器无缝整合.无论使用vs2010生成的代码,还是转换vs2008或者是更低版本vs编译的C++代码.都会在工程编译后,都会提示一条错误: C:\Program ...

  8. iOS图片加载框架-SDWebImage解读

    在iOS的图片加载框架中,SDWebImage可谓是占据大半壁江山.它支持从网络中下载且缓存图片,并设置图片到对应的UIImageView控件或者UIButton控件.在项目中使用SDWebImage ...

  9. 【转】java.lang.OutOfMemoryError: Java heap space的解决

    原文地址:http://blog.sina.com.cn/s/blog_4b12778b0100v0bb.html Myeclipse下java.lang.OutOfMemoryError: Java ...

  10. 解剖SQLSERVER 第二篇 对数据页面头进行逆向(译)

    解剖SQLSERVER 第二篇  对数据页面头进行逆向(译) http://improve.dk/reverse-engineering-sql-server-page-headers/ 在开发Orc ...