java ftpclient 下载完成文件后删除远端文件出错

anyine 发布于 2013/04/16 16:23
阅读 2K+
收藏 2
package com.hansy.pettyLoan.pub.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

/**
 * <p>decribing : FTP工具实现类</p>
 * <p>copyright : Copyright @ 2012 hansy</p>
 * <p>company   : hansy</p>
 * <p>time      : 2013-2-27上午11:19:41</p>
 *
 * @author hwen
 * @version v1.0
 */
public class FTPUtil {
	// 申请提交路径 FTP 路径
	public static final String importPath = "\\import";
	// 申请处理路径
	public static final String exportPath = "\\export";
	// 读取完成申请文件后拷贝文件路径
	public static final String copyPath = "\\copy";
	public static final String FTP_URL = "127.0.0.1";
	public static final int FTP_PORT = 21;
	public static final String FTP_USER_NAME = "test";
	public static final String FTP_PASSWORD = "test";
	
	public static FTPClient ftp = null;
	
	private FTPUtil(){}
	
	public static FTPClient getFtp() {
		if (ftp == null) {
			synchronized (FTPUtil.class) {
				if (ftp == null) {
					ftp = new FTPClient();
					int reply;
					try {
						ftp.connect(FTP_URL, FTP_PORT);
						// 连接FTP服务器
						// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
						ftp.login(FTP_USER_NAME, FTP_PASSWORD);// 登录
						reply = ftp.getReplyCode();
						if (!FTPReply.isPositiveCompletion(reply)) {
							ftp.disconnect();
						}
					} catch (SocketException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
		return ftp;
	}
	
	/**
	 * 上传文件   apache
	 * Description: 向FTP服务器上传文件
	 * @param filename   上传到FTP服务器上的文件名
	 * @param input    输入流
	 * @return 成功返回true,否则返回false
	 */
	public static boolean uploadFile(String filename, InputStream input) {
		boolean success = false;
		FTPClient ftp = getFtp();
		System.err.println(ftp);
		try {
			ftp.makeDirectory(exportPath);
			ftp.changeWorkingDirectory(exportPath);
			ftp.storeFile(filename, input);
			input.close();
			ftp.logout();
			success = true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return success;
	}

	/**
	 * Description: 从FTP服务器下载文件
	 * @param remotePath   FTP服务器上文件路径
	 * @param localPath  下载后保存到本地的路径  必须以\结束
	 * @return
	 */
	public static List<String> downFile(String remotePath, String localPath) {
		List<String> fileLst = new ArrayList<String>();;
		FTPClient ftp = getFtp();
		System.err.println(ftp);
		try {
			ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
			// 获取文件列表
			FTPFile[] fs = ftp.listFiles();
			for (FTPFile ff : fs) {
				if (!ff.isDirectory()) {
					String localPath_ = localPath + ff.getName();
					// 下载新文件
					File localFile = new File(localPath_);
					if(!localFile.exists()){
						localFile.getParentFile().mkdirs();
						localFile.createNewFile();
					}
					OutputStream is = new FileOutputStream(localFile);
					ftp.setControlEncoding("UTF-8");
					ftp.retrieveFile(ff.getName(), is);
					is.close();
					fileLst.add(localPath_);
				}
			}
			ftp.logout();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return fileLst;
	}

	
	/**
	 * 拷贝文件
	 * @param src 本地文件
	 * @throws IOException
	 */
	public static void copyFile(String src) {
		FTPClient ftp = null;
		ftp = getFtp();
		System.err.println(ftp);
		File file = new File(src);
		// 如果路径是个目录
		if (file.isDirectory()) {
			String[] fs = file.list();
			for (int i = 0;i<fs.length;i++) {
				File f = new File(fs[i]);
					copyFile(src + f.getName());
			}

		} else {
			if (file.exists()) {
				InputStream is = null;
				try {
					is = new FileInputStream(file);
					ftp.setControlEncoding("UTF-8");
					ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
					ftp.makeDirectory(copyPath);
					ftp.changeWorkingDirectory(copyPath);
					ftp.storeFile(file.getName(), is);
					is.close();
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally {
					if (ftp.isConnected()) {
						try {
							ftp.disconnect();
						} catch (IOException ioe) {
						}
					}
				}

			}
		}

	}
	/**
	 * 删除文件 传入远端目录 \test
	 * @param remotePath
	 */
	public static void deleFTPFile(String remotePath){
		FTPClient ftp = null;
		ftp = getFtp();
		System.err.println(ftp);
		try {
			ftp.changeWorkingDirectory(remotePath);
			FTPFile[] fs = ftp.listFiles();
			for (FTPFile ff : fs) {
				if (!ff.isDirectory()) {
					System.err.println(ftp.deleteFile(ff.getName()));
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
	}

	/**
	 * 测试使用
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		//下载文件
		downFile("/import", "c:\\");
		//上传文件
		try {
			uploadFile("a.txt", new FileInputStream(new File("c:\\aa.txt")));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//删除文件
//		deleFTPFile("\\02");
		copyFile("C:\\ftpRoot\\import\\");
		deleFTPFile("\\import");
		
	}
}
copyFile("C:\ftpRoot\import\");
deleFTPFile("\import");
为何执行了拷贝远端文件到另外一个文件夹之后执行删除文件夹里面的文件报错。
单独执行则无问题
加载中
返回顶部
顶部