首先树结构:
public class TreeVo {
private String label;
private List<TreeVo> children;
public TreeVo() {
}
public TreeVo(String label) {
this.label = label;
this.children = new ArrayList<>();
}
public TreeVo(String label, List<TreeVo> children) {
this.label = label;
this.children = children;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public List<TreeVo> getChildren() {
return children;
}
public void setChildren(List<TreeVo> children) {
this.children = children;
}
@Override
public String toString() {
return "TreeVo{" +
"label='" + label + '\'' +
", children=" + children +
'}';
}
}
然后代码:
/**
* 递归获取ftp文件目录树
* @param files
* @param ftpClient
* @param pTree
* @return
* @throws IOException
*/
public TreeVo recursionTree(FTPFile[] files, FTPClient ftpClient, TreeVo pTree) throws IOException {
for (FTPFile file : files) {
if (file.isDirectory()) {
// new String(file.getName().getBytes("UTF-8"),"iso-8859-1")为了将目录名的编码转成FTPClient需要的编码,否则切换目录会失败。
boolean flag = ftpClient.changeWorkingDirectory(new String(file.getName().getBytes("UTF-8"),"iso-8859-1"));
files = ftpClient.listFiles();
if (files.length > 0) {
pTree.getChildren().add(recursionTree(files, ftpClient, new TreeVo(file.getName())));
} else {
pTree.getChildren().add(new TreeVo(file.getName()));
}
} else {
pTree.getChildren().add(new TreeVo(file.getName()));
}
}
// 子文件夹遍历完成后返回上级目录
ftpClient.changeToParentDirectory();
return pTree;
}
调用方法:
public static void main(){
try {
FTPClient ftpClient = new FTPClient();
ftpClient.connect(ip, port);
ftpClient.login(user, pwd);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
logger.info("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
// 如果ftp连接成功,需要验证路径是否存在
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
ftpClient.setControlEncoding("UTF-8");
// 获取根目录文件
FTPFile[] files = ftpClient.listFiles(etlFileSource.getFilePath());
// 创建根节点
TreeVo root = new TreeVo("root");
if (files.length > 0) {
recursionTree(files, ftpClient, root);
}
}
} catch (SocketException e) {
e.printStackTrace();
logger.info("FTP的IP地址可能错误,请正确配置。");
} catch (IOException e) {
e.printStackTrace();
logger.info("FTP的端口错误,请正确配置。");
} catch (Exception e) {
e.printStackTrace();
logger.info("查询数据失败。");
}
}
这篇博客详细介绍了如何通过递归方式遍历FTP文件系统,并构建出对应的目录树结构,提供了相应的代码实现和调用方法。
2096





