首先树结构:
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;}@Overridepublic 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("查询数据失败。");}}