`

common-net ftp封装

 
阅读更多
public class FTPSystem {

	private FTPClient client = new FTPClient();
	private int port;
	private String ip;
	private String user;
	private String pw;
	private String dirId;
	private LogFactory log = LogFactory.getLog();
	private boolean preConn = false;
	
	public FTPSystem(String ip,String user,String pw,int port){
		this.port = port;
		this.ip = ip;
		this.user = user;
		this.pw = pw;
		if(connect()){
			preConn = true;
		}
	}
	/**
	 * 
	 * 连接服务器 
	 * 
	 * @return
	 * @author      YitianC 
	 * @history 
	 *              YitianC Oct 28, 2011 5:13:43 PM
	 */
	public boolean connect() {
		synchronized(this){
			if(client.isConnected()){
				preConn = true;
				return true;
			}
			long startTime = System.currentTimeMillis();
			try {
				client.setTimeOut(2000);
				client.connect(ip, port);
				client.login(user, pw);
				int reply = client.getReplyCode();
				if (!FTPReply.isPositiveCompletion(reply)) {
					client.disconnect();
					return false;
				}
				preConn = true;
				return true;
			}  catch (Exception e) {
				log.printException(null, e);
			}
			finally{
				log.debug("FTP connection cost time "+(float)(System.currentTimeMillis()-startTime)/1000+" seconds.");
			}
			return false;
		}
	}
	
	public void test(){
		FTPFile[] fs = null;
		try {
//			fs = this.getFiles(new String("/home/root/listenerDebug/十大二".getBytes("gbk"),"iso-8859-1"));
			fs = this.getFiles("/home/root/listenerDebug/十大二");
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		for(FTPFile f:fs){
			try {
				System.out.println(new String(f.getName().getBytes("iso-8859-1"),"gbk"));
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		try {
			System.out.println(this.isExist("/home/root/listenerDebug/flex配置文档1.docx"));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
/*		try {
			this.put("d:/listenerDebug/normal/flex配置文档1.docx", "/home/root/listenerDebug");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
		//this.get("/home/root/listenerDebug/flex配置文档1.docx", "d:/listenerDebug/normal/flex配置文档1.docx");
	}
	/**
	 * 
	 * 上传 
	 * 
	 * @param localPath
	 * @param remotePath
	 * @return
	 * @author      YitianC 
	 * @history 
	 *              YitianC Oct 26, 2011 12:28:28 PM
	 */
	public boolean put(String localPath,String remotePath)throws Exception{
		synchronized(this){
			if(localPath==null || remotePath==null)
				return false;
			File localFile = new File(localPath);
			if(!localFile.exists()) return false;
			if(!preConn)return false;
			if(!connect()){
				return false;
			}
			if(!mkdir(remotePath)){
				System.out.println("无法建立目录 "+remotePath);
				return false;
			}
			String fileName = localFile.getName();
			try{
				fileName = new String(fileName.getBytes("gbk"),"iso-8859-1");
			}catch(Exception e){
				
			}
			String remoteFile = DirUtil.dirAddFileName(remotePath, fileName);
			DataInputStream dis =null;;
			try {
				client.setFileType(FTPClient.BINARY_FILE_TYPE);// 必须是二进制类型,不然会导致错误
				dis= new DataInputStream(new FileInputStream(localFile));
				return client.storeFile(remoteFile, dis);
	
			} catch (IOException e) {
				log.printException(null, e);
			}
			finally{
	
				if(dis!=null){
					dis.close();
				}
			}
			return false;
		}
	}
	/**
	 * 
	 * 下载 
	 * 
	 * @param remoteName
	 * @param localPath
	 * @return
	 * @author      YitianC 
	 * @history 
	 *              YitianC Oct 26, 2011 12:28:35 PM
	 */
	public boolean get(String remoteName,String localPath){
		synchronized(this){
			if(!preConn)return false;
			if(!connect()) return false;
			// 分段读取
			DataOutputStream os = null;
			try {
				client.setFileType(FTPClient.BINARY_FILE_TYPE);// 必须是二进制类型,不然会导致错误
				os = new DataOutputStream(new FileOutputStream(localPath));
				return client.retrieveFile(remoteName, os);
			} catch (Exception e) {
				e.printStackTrace();
				log.printException(null, e);
				return false;
			} finally {
				if (os != null) {
					try {
						os.close();
					} catch (IOException e) {
						log.printException(null, e);
					}
				}
			}
		}
	}
	/**
	 * 
	 * 根据文件名取得文件大小  
	 * 
	 * @param name  文件名
	 * @return
	 * @author      YitianC 
	 * @history 
	 *              YitianC Oct 28, 2011 5:14:33 PM
	 */
	public long getFileSize(String name){
		FTPFile file = this.getFile(name);
		if(file == null) return 0;
		return file.getSize();
	}
	/**
	 * 
	 * 取得文件的详细信息 
	 * 
	 * @param path 文件路径
	 * @return
	 * @author      YitianC 
	 * @history 
	 *              YitianC Oct 28, 2011 5:15:03 PM
	 */
	public FTPFile getFile(String path){
		synchronized(this){
			if(!preConn)return null;
			if(!connect()) return null;
			FTPFile[] f;
			try{
				path = new String(path.getBytes("gbk"),"iso-8859-1");
			}catch(Exception e){
				
			}
			try {
				f = client.listFiles(path);
			} catch (Exception e) {
				log.printException(null, e);
				return null;
			}
			if(f==null){
				return null;
			}
			else if(f.length==0){
				return null;
			}
			FTPFile file = f[0];
			f = null;
			return file;
		}
	}
	/**
	 * 
	 * 进入FTP目录 相当于cd命令 
	 * 
	 * @param path
	 * @return
	 * @author      YitianC 
	 * @history 
	 *              YitianC Oct 28, 2011 5:16:22 PM
	 */
	public boolean cd(String path){
		synchronized(this){
			try {
				if(!preConn)return false;
				return client.changeWorkingDirectory(path);
			} catch (IOException e) {
				log.printException(null, e);
			}
			return false;
		}
	}
	/**
	 * 
	 * 判断文件或路径是否存在 
	 * 
	 * @param path
	 * @return
	 * @author      YitianC 
	 * @history 
	 *              YitianC Oct 28, 2011 5:16:47 PM
	 */
	public boolean isExist(String path){
		synchronized(this){
			if(!preConn)return false;
			FTPFile[] f;
			String fileName = DirUtil.getLastPathName(path);
			try{
				fileName = new String(fileName.getBytes("gbk"),"iso-8859-1");
			}catch(Exception e){
				
			}
			try {
				f = client.listFiles(DirUtil.getParentPath(path));
				if(f!=null){
					for(FTPFile ff:f){

						if(ff.getName().equals(fileName)){
							return true;
						}
					}
				}
			} catch (Exception e) {
				log.printException(null, e);
				return false;
			}
			return false;
		}
	}
	/**
	 * 
	 * 取得path目录下的文件列表  
	 * 
	 * @param path
	 * @return
	 * @author      YitianC 
	 * @history 
	 *              YitianC Oct 28, 2011 5:17:06 PM
	 */
	public FTPFile[] getFiles(String path){
		synchronized(this){
			if(!preConn)return null;
			if(!connect()) return null;
			try{
				path = new String(path.getBytes("gbk"),"iso-8859-1");
			}
			catch(Exception e){
				
			}
			try {
				return client.listFiles(path);
			} catch (IOException e) {
				log.printException(null, e);
			}
			return null;
		}
	}
	/**
	 * 
	 * 移动文件 
	 * 
	 * @param path  原路径
	 * @param newPath	新路径
	 * @return
	 * @author      YitianC 
	 * @history 
	 *              YitianC Oct 28, 2011 5:17:22 PM
	 */
	public boolean move(String path,String newPath){
		synchronized(this){
			if(!preConn)return false;
			if(!connect())return false;
			try {
				return client.rename(path, newPath);
			} catch (IOException e) {
				log.printException(null, e);
			}
			return false;
		}
	}
	
	public void printFiles(FTPFile[] files){
		synchronized(this){
			if(files==null) return;
			for(FTPFile f:files){
				log.debug("name="+f.getName());
			}
		}
	}
	/**
	 * 
	 * 建立目录 
	 * 
	 * @param path
	 * @return
	 * @author      YitianC 
	 * @history 
	 *              YitianC Oct 28, 2011 5:18:01 PM
	 */
	public boolean mkdir(String path){
		synchronized(this){
			if(!preConn)return false;
			if(!connect())return false;
			if(this.isExist(path))return true;
			path = this.getEncodePath(path);
			try {
				return mkd(path);
			} catch (Exception e) {
				log.printException(null, e);
				return false;
			}
		}
	}
	public boolean mkd(String path)throws Exception{
		synchronized(this){
			if(!preConn)return false;
			if(!connect())return false;
			if(!this.isExist(path)){
				if(!mkd(DirUtil.getParentPath(path))){
					return false;
				}
				int rt = client.mkd(path);
				if(this.isExist(path)){
					return true;
				}
				return false;
			}
			return true;
		}
	}
	/**
	 * 
	 * 断开连接 
	 * 
	 * @return
	 * @author      YitianC 
	 * @history 
	 *              YitianC Oct 28, 2011 5:18:19 PM
	 */
	public boolean disConnect(){
		synchronized(this){
			if(!preConn)return true;
			if(client.isConnected()){
				try {
					client.disconnect();
					return true;
				} catch (IOException e) {
					log.printException(null, e);
					return false;
				}
			}
			return true;
		}
	}
	
	public String getEncodePath(String path){
		try {
			String npath = new String(path.getBytes("utf-8"),"iso-8859-1");
			path = npath;
		} catch (UnsupportedEncodingException e1) {
			log.printException(null, e1);
		}catch(Exception e){
			log.printException(null, e);
		}
		return path;
	}
	public boolean rmDir(String path){
		synchronized(this){
			try{
				if(!preConn)return false;
				path = this.getEncodePath(path);
				client.rmd(path);
			}catch(Exception e){
				log.printException(null, e);
				return false;
			}
		}
		return !this.isExist(path);
	}
	public boolean rmEmptyDir(String path){
		try{
			String paDir = DirUtil.getParentPath(path);
			FTPFile f [] = this.getFiles(path);
			if(f == null){
				return true;
			}
			else if(f.length==0){
				return true;
			}
			else if(f.length==2){
				String name1 = f[0].getName();
				String name2 = f[1].getName();
				if(name2==null||name1==null){
					return false;
				}
				else{
					if((name2.equals(".")&&name1.equals(".."))||(name1.equals(".")&&name2.equals(".."))){
						if(!this.rmDir(path)){
							return false;
						}
						else {
							return rmEmptyDir(paDir);
						}
					}
					else{
						return false;
					}
				}
			}

		}catch(Exception e){
			log.printException(null, e);
		}
		return false;
	}
	
	public void release(){
		if(disConnect()){
			client = null;
		}
	}
	public static void main(String[] args){
		FTPSystem f = new FTPSystem("172.19.201.200","weblogic","web123",21);
		f.test();
	}

	public String getDirId() {
		return dirId;
	}

	public void setDirId(String dirId) {
		this.dirId = dirId;
	}
	public int getPort() {
		return port;
	}
	public void setPort(int port) {
		this.port = port;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	public String getUser() {
		return user;
	}
	public void setUser(String user) {
		this.user = user;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public boolean isPreConn() {
		return preConn;
	}
	public void setPreConn(boolean preConn) {
		this.preConn = preConn;
	}
}

 

好像这个版本的不支持设置连接超时,所以重写了个

 

 class FTPClient extends org.apache.commons.net.ftp.FTPClient{

	private SocketFactory _socketFactory_=SocketFactory.getDefault();
	private int timeOut = 2000;
	public FTPClient(){
		
	}
    public void connect(InetAddress host, int port)
    throws SocketException, IOException
    {
    	_socket_=this._socketFactory_.createSocket();
        _socket_.connect(new InetSocketAddress(host, port), timeOut);
        _connectAction_();
    }
    public void connect(String hostname, int port)
    throws SocketException, IOException
    {
        connect(InetAddress.getByName(hostname), port);
    }
    public void setConnTimeOut(int timeOut){
    	
    }
	public int getTimeOut() {
		return timeOut;
	}
	public void setTimeOut(int timeOut) {
		this.timeOut = timeOut;
	}
}

 

分享到:
评论

相关推荐

    Apache Common-net Ftp客户端实例

    <artifactId>commons-net</artifactId> <version>3.6 ``` 接下来,我们将创建一个名为`FtpHelper`的Java类,用于封装FTP操作。`FtpHelper.java`文件的内容可能如下: ```java import org.apache.commons.net....

    commons-ftp中ftpClient类的API.pdf

    FTPClient是这个库中的一个核心类,它封装了与FTP服务器进行交互的大部分功能。以下是从文档内容中提取的知识点: 1. FTPClient类的继承体系:FTPClient类继承自FTP类,并且FTP类继承自SocketClient类, Socket...

    Mini-FTP.tar.gz_C++ FTP_FTP CLIENT_FTP client c++_c++ ftp_c++ft

    9. **头文件和库**:从文件名"requests.h"和"common.h"来看,项目可能使用了自定义的头文件来封装常见的FTP请求和通用功能。此外,可能还使用了标准库如 `<iostream>`、`<string>`、`<vector>` 和 `<sys/socket.h>` ...

    FTP操作示例

    在实际使用中,需要确保正确添加了依赖的Apache Commons Net库,即`commons-net-x.x.jar`和`commons-net-ftp-x.x.jar`。在Maven或Gradle项目中,可以通过配置依赖管理来导入这些库。 总的来说,Apache Commons Net...

    FTP、SMB方式下载、删除远程服务器文件

    与FTP不同,SMB使用单一TCP连接进行所有通信,通过封装多个操作在一个会话中,提高了效率。SMB 2.0及更高版本引入了并发、断点续传和加密功能,进一步增强了性能和安全性。 下载远程服务器文件: 使用FTP,你可以...

    Ubuntu系统下Pure-ftpd的安装及配置教程.docx

    对于喜欢使用配置文件的用户,Pure-FTPd官方提供了一种解决方案:通过一个封装工具,将配置文件解析并将其转换成命令行参数。首先编辑配置文件pure-ftpd.conf,然后使用以下命令启动: ``` pure-config.pl /etc/pure...

    网络编程实用教程(第三版)--程序源代码.rar.zip

    它封装了Windows API,使得开发者能够更容易地创建功能丰富的桌面应用程序,并且支持网络通信。书中可能通过MFC的类库,如CInternetSession、CGopherSession、CHttpSession等,讲解如何进行HTTP、FTP等网络协议的...

    ASP.Net基础教程-C#基础

    - **继承、封装和多态**:OOP 的三大特性,理解它们如何提高代码的复用性和灵活性。 - **异常处理**:使用 try-catch 语句捕获和处理运行时错误。 - **命名空间**:组织代码,避免命名冲突。 2. **ASP.NET 基础*...

    qt_for_mobile_slides_day_1.pdf

    - **Symbian API封装**:如何使用Active Objects处理异常和Leaves,以及Mobility APIs的使用。 - **移动扩展**:转换、T-Types、描述符与QString/QByteArray的使用、容器、图像转换等。 #### 五、周五课程议程 - **...

    信息系统项目管理师要点整理.docx

    - **OMG (Object Management Group)** 的 CORBA (Common Object Request Broker Architecture)。 - **Sun Microsystems** 的 EJB (Enterprise JavaBeans)。 - **Microsoft** 的 DCOM (Distributed Component Object ...

    VC# 2OO5 学习教案

    - 封装:通过访问修饰符(public, private, protected等)实现数据隐藏,保护内部结构不被外部直接访问。 - 继承:子类可以继承父类的属性和方法,实现代码重用。 - 多态:同一方法在不同类中有不同的表现形式,...

    network-storage-master.rar

    5. iSCSI(Internet Small Computer System Interface):将SCSI指令封装在TCP/IP协议中,实现块级存储的网络传输。 三、网络存储架构 1. RAID(Redundant Array of Independent Disks):通过磁盘冗余提高数据...

    Microsoft .NET Framework概述-C#学习(1)

    - .NET Framework不仅仅是一个编程框架,它还是一个生态系统,包含了编译器、库、运行时环境(CLR,Common Language Runtime)以及用于开发和部署应用程序的工具。 - CLR是.NET Framework的核心,负责代码的执行、...

    Visual C++.NET应用编程150例.rar

    - **类与对象**:C++.NET继承了C++的面向对象特性,包括类的定义、对象的创建、封装、继承和多态。 - **命名空间**:C++.NET引入了命名空间来组织代码,避免命名冲突。 - **模板**:模板允许创建泛型函数和类,...

    2008年上半年网工下午题答案

    - 允许执行CGI程序:CGI (Common Gateway Interface) 是一种标准,使Web服务器能够执行服务器上的脚本,从而提供动态内容。 4. **NAT与访问控制** (对应第四题) - NAT(Network Address Translation)用于将私有...

    POCO库及文档

    POCO库,全称为“Poor Man's Common C++ Object”,是一个开源的C++类库,旨在为开发跨平台的应用程序提供一套轻量级且强大的工具集。POCO库的设计理念是简单、高效且易于使用,它包含了许多现代软件开发所需的关键...

    2021-2022计算机二级等级考试试题及答案No.170.docx

    2. **FTP服务**:FTP(File Transfer Protocol)是一种在Internet上用于文件传输的服务,可以用来下载或上传文件到服务器。 3. **循环队列**:循环队列是一种线性数据结构,队列中元素的个数由队头和队尾指针共同...

    perl编程24小时教程

    - CGI(Common Gateway Interface)模块使得Perl能够处理Web服务器的动态内容生成。 - 更现代的Web框架,如Dancer和Mojolicious,简化了Web应用的开发。 通过这个24小时的Perl编程教程,你将逐步了解并掌握这些...

    alien-sdl-开源

    在开源软件的世界里,Alien-sdl是一个值得关注的项目,它为SBCL(Steel Bank Common Lisp)提供了一个与SDL(Simple DirectMedia Layer)库交互的外部函数接口绑定。本文将深入探讨Alien-sdl的功能、作用以及其在...

    java JSP Servlet试题 带答案

    实现动态网站的技术包括但不限于CGI (Common Gateway Interface)、ASP (Active Server Pages) 和 PHP (Hypertext Preprocessor)。而HTTP (HyperText Transfer Protocol) 是一种用于传输超文本(如 HTML 文档)的应用...

Global site tag (gtag.js) - Google Analytics