实现了下载文件Download()与获取FTP服务器上文件列表信息GetFileList()

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.IO;
  5 using System.Net;
  6 using System.Windows.Forms;
  7 
  8 namespace PCMDataImporter
  9 {
 10     /// <summary>
 11     /// 封装了FTP的两个操作:下载文件Download()和获取FTP服务器上文件列表信息GetFileList()
 12     /// </summary>
 13     public class ftpOperater
 14     {
 15         private string ftpServerIP;
 16         private string ftpUser;
 17         private string ftpPwd;

 18 
 19         private SystemParaReader spReader;
 20 
 21         public ftpOperater()
 22         {
 23             spReader = new SystemParaReader();
 24             this.ftpServerIP = spReader.GetSysParaValue("ftpServer");
 25             this.ftpUser = spReader.GetSysParaValue("ftpUser");
 26             this.ftpPwd = spReader.GetSysParaValue("ftpPwd");
 27         }
 28 
 29         /// <summary>
 30         /// 获取ftp服务器上的文件信息
 31         /// </summary>
 32         /// <returns>存储了所有文件信息的字符串数组</returns>
 33         public string[] GetFileList()
 34         {
 35             string[] downloadFiles;
 36             StringBuilder result = new StringBuilder();
 37             FtpWebRequest reqFTP;
 38             try
 39             {
 40                 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/"));
 41                 reqFTP.UseBinary = true;
 42                 reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPwd);
 43                 reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
 44                 WebResponse response = reqFTP.GetResponse();
 45                 StreamReader reader = new StreamReader(response.GetResponseStream());
 46 
 47                 string line = reader.ReadLine();
 48                 while (line != null)
 49                 {
 50                     result.Append(line);
 51                     result.Append("\n");
 52                     line = reader.ReadLine();
 53                 }
 54                 result.Remove(result.ToString().LastIndexOf('\n'), 1);
 55                 reader.Close();
 56                 response.Close();
 57 
 58                 return result.ToString().Split('\n');
 59             }
 60             catch (Exception ex)
 61             {
 62                 System.Windows.Forms.MessageBox.Show("获取文件信息失败:"+ex.Message,"操作失败",MessageBoxButtons.OK,MessageBoxIcon.Error);
 63                 downloadFiles = null;
 64                 return downloadFiles;
 65             }
 66         }
 67 
 68         /// <summary>
 69         /// 获取FTP上指定文件的大小
 70         /// </summary>
 71         /// <param name="filename">文件名</param>
 72         /// <returns>文件大小</returns>
 73         public long GetFileSize(string filename)
 74         {
 75             FtpWebRequest reqFTP;
 76             long fileSize = 0;
 77             try
 78             {
 79                 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + filename));
 80                 reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
 81                 reqFTP.UseBinary = true;
 82                 reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPwd);
 83                 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
 84                 Stream ftpStream = response.GetResponseStream();
 85                 fileSize = response.ContentLength;
 86 
 87                 ftpStream.Close();
 88                 response.Close();
 89             }
 90             catch (Exception ex)
 91             {
 92                 MessageBox.Show("获取文件大小时,出现异常:\n" + ex.Message, "获取文件大小失败!", MessageBoxButtons.OK, MessageBoxIcon.Error);
 93             }
 94             return fileSize;
 95         }
 96 
 97         /// <summary>
 98         /// 实现ftp下载操作
 99         /// </summary>
100         /// <param name="filePath">保存到本地的文件名</param>
101         /// <param name="fileName">远程文件名</param>
102         public void Download(string filePath, string fileName)
103         {
104             FtpWebRequest reqFTP;
105             try
106             {
107                 //filePath = <<The full path where the file is to be created.>>,
108                 //fileName = <<Name of the file to be created(Need not be the name of the file on FTP server).>>
109                 FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
110 
111                 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileName));
112                 reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
113                 reqFTP.UseBinary = true;
114                 reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPwd);
115                 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
116                 Stream ftpStream = response.GetResponseStream();
117                 long cl = response.ContentLength;
118                 int bufferSize = 2048;
119                 int readCount;
120                 byte[] buffer = new byte[bufferSize];
121 
122                 readCount = ftpStream.Read(buffer, 0, bufferSize);
123                 while (readCount > 0)
124                 {
125                     outputStream.Write(buffer, 0, readCount);
126                     readCount = ftpStream.Read(buffer, 0, bufferSize);

127                 }
128 
129                 ftpStream.Close();
130                 outputStream.Close();
131                 response.Close();
132             }
133             catch (Exception ex)
134             {
135                 MessageBox.Show(ex.Message);
136             }
137         }
138     }
139 }
140  

 

转载于:https://www.cnblogs.com/weiqt/articles/3907387.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个比较复杂的工具,需要考虑很多细节,以下是一个简单的示例代码,仅供参考: ```java import java.io.*; import java.net.*; public class FtpParser { private String ftpUrl; private String ftpUser; private String ftpPass; private String localPath; private int threadNum; private int bufferSize; private String[] fileList; private int fileNum; public FtpParser(String ftpUrl, String ftpUser, String ftpPass, String localPath, int threadNum, int bufferSize) { this.ftpUrl = ftpUrl; this.ftpUser = ftpUser; this.ftpPass = ftpPass; this.localPath = localPath; this.threadNum = threadNum; this.bufferSize = bufferSize; } public void parse() { getFileList(); if (fileList == null || fileList.length == 0) { System.out.println("No files to parse."); return; } fileNum = fileList.length; int blockSize = fileNum / threadNum + 1; for (int i = 0; i < threadNum; i++) { int start = i * blockSize; int end = Math.min((i + 1) * blockSize, fileNum); new Thread(new ParserThread(start, end)).start(); } } private void getFileList() { try { URL url = new URL(ftpUrl); URLConnection conn = url.openConnection(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; StringBuilder fileListBuilder = new StringBuilder(); while ((line = reader.readLine()) != null) { if (line.startsWith("drwx")) { continue; } fileListBuilder.append(line).append("\n"); } reader.close(); fileList = fileListBuilder.toString().split("\n"); } catch (Exception e) { e.printStackTrace(); } } private class ParserThread implements Runnable { private int startIdx; private int endIdx; public ParserThread(int startIdx, int endIdx) { this.startIdx = startIdx; this.endIdx = endIdx; } @Override public void run() { for (int i = startIdx; i < endIdx; i++) { String fileName = fileList[i]; if (fileName.isEmpty()) { continue; } parseFile(fileName); } } private void parseFile(String fileName) { try { URL url = new URL(ftpUrl + fileName); URLConnection conn = url.openConnection(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; StringBuilder contentBuilder = new StringBuilder(); while ((line = reader.readLine()) != null) { contentBuilder.append(line).append("\n"); } reader.close(); File file = new File(localPath + fileName); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } BufferedWriter writer = new BufferedWriter(new FileWriter(file)); writer.write(contentBuilder.toString()); writer.close(); } catch (Exception e) { e.printStackTrace(); } } } } ``` 使用示例: ```java FtpParser parser = new FtpParser("ftp://example.com/", "username", "password", "/path/to/local/folder/", 4, 1024 * 1024); parser.parse(); ``` 其中,`ftpUrl`为FTP服务器的地址,`ftpUser`和`ftpPass`为登录FTP服务器的用户名和密码,`localPath`为要保存文件的本地文件夹路径,`threadNum`为线程数,`bufferSize`为缓冲区大小。在`parse()`方法中,首先获取FTP服务器上的文件列表,然后根据线程数启动多个线程来解析文件。每个线程处理一部分文件,对于每个文件,首先下载到本地,然后保存到指定的本地文件夹中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值