文档章节

用commons-net包写Ftp客户端下载(三)

猴子
 猴子
发布于 2011/10/20 17:51
字数 872
阅读 509
收藏 1

由于上次说了,如果客户端遍历FTP服务器的话,如果FTP上文件数量很大,那样的话,递归遍历的时间会超级长。。

(还没有说明。。我们这是EJB项目。。是FTP服务器上调用我的这个客户端进行下载。。我只想这个EJB客户端是发布在另一台

机器上的。。)

所以我就考虑,是否可以服务器端自己遍历,自己遍历FTP的文件夹,然后把遍历的结果通过webservice传给我。因为,本地遍历

的所需要的时间很少很少。比如13000个文件如果客户端遍历FTP服务器大概需要3个小时以上,然后本地遍历就1.4秒。。

很无语的效率。。所以服务器断遍历之后生成我需要的数据,然后传给我,我那道之后直接开始下载即可。。

FTP服务器端遍历工具类。。。(其实就是文件遍历。。)

import java.io.File;
import java.util.ArrayList;

import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;

import  ftpdownloadservice.FtpFile;//webservice





/**
 * 
 * 文件操作工具类
 * 
 * @author houly
 * 
 */
public class FileUtil {
	// 日志
	private static Logger logger = Logger.getLogger(FileUtil.class);

	
	public static List<FtpFile> traversalDir(File dir, List<FtpFile> list) {
	//	logger.info("开始进入FileUtil中的traversalDir方法......");
		// 判断参数
		if (dir == null) {
			logger.error("参数为空.....");
			return null;
		}
		// 判断复制目录是否是目录
		if (!dir.isDirectory()) {
			logger.error("开始目录设置错误....");
			return null;
		}
		// 列出该目录下的所有文件
		File[] files = dir.listFiles();
		if (list == null)
			list = new ArrayList<FtpFile>();
		for (int i = 0; i < files.length; i++) {
			File file = files[i];
			// 递归调用......
			if (file.isDirectory()) {
				traversalDir(file,list);
			} else {
				list.add(change(file,new File( ReadProperties.readProperties("rrs.properties", "ftpimagepath"))));
			}
		}
		
		
		
	//	logger.info("开始进入FileUtil中的traversalDir方法结束......");
		return list;
	}

	public static FtpFile change(File file,File dir){

		if(file.isDirectory()){
			logger.error("目标文件是目录");
			return null;
		}
		
		if(dir==null ||  dir.isFile()){
			logger.error("目录参数出错.....");
			return null;
		}
		
		String path = dir.getAbsolutePath();
		
		String filePath = file.getAbsolutePath();
		
		int index_begin = filePath.indexOf(path);
		
		if(index_begin == -1 ){
			return null;
		}
		index_begin = path.length()-1;
		FtpFile ftpFile = new FtpFile();
		ftpFile.setFileName(file.getName());
		while(true){
			
			int index_end = filePath.indexOf("\\", index_begin+1);
			if(index_end == index_begin+1 ){
				ftpFile.getList().add("/");
			}
			else if(index_end == -1){
				break;
			}
			else{
				ftpFile.getList().add(filePath.substring(index_begin+1, index_end));
			}
			index_begin = index_end;
			
		}
//		logger.info("内容");
//		logger.info(ftpFile.getList());
		return ftpFile;
	}

很简单不多说了。。。

再发下客户端代码把。。。更改之后的。。。

public boolean executeDownload(List<FtpFile> list) {
		logger.info("进入FtpDownloadServiceImpl的executeDownload方法");

		int num = list.size();
		logger.info("遍历ftp目录里面文件的个数为" + num);

		String local_downLoad_dir = ConfigInfo.getFtpDownLoadDir();
		logger.info("得到配置文件中下载目录为:" + local_downLoad_dir);

		int flag = 0;
		//根据遍历结果从FTP上下载文件
		int count = 0;
		for (FtpFile file : list) {
			count++;
			logger.info("开始下载"+num+"个文件中的第"+count+"个文件");
			//FTP连接
			ftpHelper = new FtpHelper();
			ftpHelper.connect(ConfigInfo.getFtpHostName(),
					ConfigInfo.getPort(), ConfigInfo.getUsername(), ConfigInfo
							.getPassword());
			
			//该文件工作空间集合
			List<String> filepath = file.getList();
			//文件下载到本地的路径
			String local_path = local_downLoad_dir;
			
			// 变更工作目录
			// 组合下载路径
			for (int i = 0; i < filepath.size(); i++) {
				//如果是空间默认的开始工作空间
				if ("/".equals(filepath.get(i))) {
					local_path += filepath.get(i);
				} else {
					//其他的工作空间
					
					//变更工作空间
					ftpHelper.changeDir(filepath.get(i));
					
					//组合本地路径
					local_path += filepath.get(i) + "/";
				}
			}

			logger.info("组合之后下载目录为:" + local_path);
			
			//如果本地工作路径不存在,建立目录
			File local_file = new File(local_path);
			if (!local_file.exists()) {
				local_file.mkdirs();
			}
			
			//进行下载并返回下载结果
			Boolean status = ftpHelper.downloadonefile(file
					.getFileName(), local_path + file.getFileName());

			if (!status)
				flag++;

			//断开FTP连接
			ftpHelper.disconnect();

		}

		
		//判断返回结果
		logger.info("进入FtpDownloadServiceImpl的executeDownload方法结束");
		if (flag != 0) {
			return false;
		}

		return true;
	}

 

本来认为这样就会没事的。。但是发现单线程下载FTP速度太慢。。局域网里面,不限速的清空,13000多文件,400多M

需要时间1个半小时。。。还是时间太长。。于是,多线程。。。。(命苦啊。。。。)

© 著作权归作者所有

猴子

猴子

粉丝 10
博文 14
码字总数 15499
作品 0
青岛
项目经理
私信 提问
加载中

评论(1)

懂鑫
希望能够加你啊 我这里遇到点问题
用commons-net包写Ftp客户端下载(一)

由于需要客户需求,需要把Ftp上的所有文件下载到本地,包括目录和文件。看到文件数量的时候我就哭了。。 几万个文件,晕死。这个地方我遇到的几个困难我会一一说明。 下载commons-net包我就不...

猴子
2011/10/20
4.4K
1
使用apache的FTPServer搭建ftp服务器

一:启动ftp服务 1.下载Apache FtpServer 1.0.6 Release: http://mina.apache.org/downloads-ftpserver.html 2.解压后res/conf下找到user.properties (修改密码为admin默认是md5加密后的) ......

路叫兽
2016/08/11
476
0
用commons-net包写Ftp客户端下载(二)

上次写完了工具类,那么然后就是另一个工具类了。 1.也就是对ftp上文件的遍历。 这里我发现了一个问题,下载文件的时候,每次都得重新连接,也就是一次连接只能下载一个文件。 虽然到最后我也...

猴子
2011/10/20
895
0
FTP断点续传卡死的问题。

用Apache Commons-Net包中的FtpClient做文件上传,从手机上传到服务器,手机使用WiFi连接,Server是Linux的vsftpd搭建的。 有以下特殊情况:上传文件到一半的时候,手动关掉WiFi致其上传失败...

摆渡者
2015/07/29
1.9K
0
CKEditor3.x 在Java项目中配置、包括图片上传(支持FTP、图片压缩)

CKEditor 3.x配置说明 一、基本使用: 1、所需文件架包 A. Ckeditor基本文件包,比如:ckeditor_3.6.2.zip 下载地址:http://ckeditor.com/download 2、配置使用 A.将下载下来的CKEditor压缩...

一枚Sir
2014/05/29
2.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

web前端入门很容易,全栈却很难,为什么每个程序员都那么说?

互联网行业无疑是当今社会颇具包容性且发展前景广阔的一个行业,如果单纯只是学习前端编程语言、而不懂后端编程语言,也不能算作是优秀的前端工程师。在成为一个优秀的前端工程师的道路上,充...

梦想编程
25分钟前
23
0
E.T. 团队:TiDB 开源生态宇宙构造者|PingCAP 招聘季

Welcome ! The Builders ! 这是一篇招募 TiDB 生态宇宙创造者、工程师、看管者的文章。 众所周知,PingCAP 一直坚定地拥抱「开源」,“自由灵魂”、“人文主义” 的信仰也深植每个 PingCAPe...

TiDB
36分钟前
14
0
面试刷题29:mysql事务隔离实现原理?

mysql的事务是innodb存储引擎独有的,myisam存储引擎不支持事务。 事务最经典的例子就是转账了,事务要保证的是一组数据库的操作要么全部成功,要么全部失败。是为了保证高并发场景下数据的正...

李福春carter
37分钟前
18
0
Java并发编程:volatile关键字解析

volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生...

riseee
40分钟前
18
0
Parallels Desktop 15 for Mac 稳定版

Parallels Desktop 15是功能最强大灵活度最高的虚拟化方案,无需重启即可在同一台电脑上随时访问Windows和Mac两个系统上的众多应用程序。从仅限于PC的游戏到生产力软件,Parallels Desktop 1...

麦克W
41分钟前
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部