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;
	}
}

 

你可能感兴趣的:(com)