Java遍历(扫描)ftp站点资源的方法
1.首先需要2个ftp的辅助jar包。(commons-net-1.4.1.jar和jakarta-oro-2.0.8.jar),这个可以自己去百度搜索一下并build path,然后就建一个类叫ListFtp后就能直接把下面的源代码复制然后运行了(当然你需改动里面你要扫描的ftp站点,和登陆用户名,密码这3样信息就OK了)。
2.遍历并打印在ftp里面扫描到的资源信息,主要还是用到递归思想。如果当前遍历的是文件夹,则继续向下一层目录遍历,如果是文件则打印出来。这里如果想保存资源信息的话可以自己写一个连接数据库的代码,然后把我那代码打印资源信息的地方改成插入到数据库即可。
源代码:
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
/*
* 此类是直接可以运行,然后扫描
* 我这扫描的ftp站点是自己电脑上建立的,外网扫描不到。
* 如果要用此代码只需要改一下main函数里的ftp站点就能直接运行
* */
public class ListFtp {
private int recNum = 0;
public static void main(String[] args) throws Exception {
ListFtp listFtp = new ListFtp();
//要扫描的ftp站点地址,用户名和密码,其中地址不用填前半部分信息。
//如果ftp不需要用户名和密码就能直接进入其实是匿名登录方式。此时用户名是:anonymous,密码为空
//如:listFtp.loginFtp("ftp.jmu.edu.cn", "anonymous", "");
FTPClient ftp = listFtp.loginFtp("192.168.8.102", "liuli", "0425");
listFtp.traverse("ftp://192.168.8.102", ftp, ftp
.printWorkingDirectory());
System.out.println("总共有" + listFtp.recNum +"个文件。");
System.out.println("---------------------------------");
listFtp.ftpClose(ftp);
}
//Ftp登陆,注意此处host不能带ftp://,直接传入站点后半部分就可以了
public FTPClient loginFtp(String host, String user, String pass) {
int reply;
boolean loginFlag = false;
FTPClient ftp = new FTPClient();
ftp.setControlEncoding("GBK");
try {
ftp.connect(host);
System.out.println("Connected to " + host);
System.out.print(ftp.getReplyString());
reply = ftp.getReplyCode();
ftp.setFileTransferMode(FTP.ASCII_FILE_TYPE);
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
System.err.println("FTP server refused connection.");
System.exit(1);
}
loginFlag = ftp.login(user, pass);
} catch (IOException e) {
e.printStackTrace();
}
if (loginFlag) {
System.out.println("login success");
System.out.println("host" + host);
return ftp;
} else {
System.out.println("login failed");
return null;
}
}
//与ftp断开连接
public void ftpClose(FTPClient ftp) {
try {
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
}
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
System.out.println("与ftp断开连接!");
}
// 遍历并打印ftp站点资源信息
public void traverse(String host, FTPClient client, String path) {
String prefix = "";
try {
FTPFile[] files = client.listFiles(path);
for (int i = 0; i < files.length; i++) {
// 如果是文件夹就递归方法继续遍历
if (files[i].isDirectory()) {
/*
* 创建新目录时会自动创建两个文件名: . 和 .. 点指当前目录 点点指父目录
*/
// 注意这里的判断,否则会出现死循环
if (!files[i].getName().equals(".")
&& !files[i].getName().equals("..")) {
String tempDir = client.printWorkingDirectory() + "/"
+ files[i].getName();
client.changeWorkingDirectory(tempDir);
// 是文件夹就递归调用
traverse(host, client, tempDir);
prefix += client.printWorkingDirectory();
client.changeToParentDirectory();
}
// 如果是文件就扫描信息
} else {
String temp = client.printWorkingDirectory();
Date date = null;
// 根目录下的文件
if (temp.equals("/")) {
recNum++;
date = files[i].getTimestamp().getTime();
java.sql.Date date2 = new java.sql.Date(date.getTime());
System.out.println("文件名:" + files[i].getName());
System.out.println("文件路径:" + host + temp);
System.out
.println("文件大小:" + format(files[i].getSize()));
System.out.println("最后修改日期:" + date2);
System.out
.println("-----------------------------------");
// 不是根目录下的文件
} else {
recNum++;
// 得到文件的时间戳
date = files[i].getTimestamp().getTime();
// 转换成保存到数据库的时间格式
java.sql.Date date2 = new java.sql.Date(date.getTime());
// 如果扫描是文件就将信息保存到数据库
System.out.println("文件名:" + files[i].getName());
System.out.println("文件路径:" + host + temp + "/");
System.out
.println("文件大小:" + format(files[i].getSize()));
System.out.println("最后修改日期:" + date2);
System.out
.println("-----------------------------------");
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 转换文件大小的方法
public String format(long size) {
if (size < 1024) {
return size + "B";
} else if (size < 1048576) {
double beforeNum = size / 1024;
double temp = size % 1024;
double afterNum = temp / 1024;
// 取小数点后1位
double num = new BigDecimal(beforeNum + afterNum).setScale(1,
BigDecimal.ROUND_HALF_UP).doubleValue();
return num + "KB";
} else if (size < 1073741824) {
double beforeNum = size / 1048576;
double temp = size % 1048576;
double afterNum = temp / 1048576;
double num = new BigDecimal(beforeNum + afterNum).setScale(2,
BigDecimal.ROUND_HALF_UP).doubleValue();
return num + "MB";
} else {
double beforeNum = size / 1073741824;
double temp = size % 1073741824;
double afterNum = temp / 1073741824;
double num = new BigDecimal(beforeNum + afterNum).setScale(2,
BigDecimal.ROUND_HALF_UP).doubleValue();
return num + "GB";
}
}
}