最近的一个需求为扫描FTP文件夹下的所有文件用于前端下载, 要求多层文件夹内的文件也能被扫到.
多层文件夹一般就要用到递归了, 上代码:
/**
* 递归获取所有FTP文件
*
* @param ftp ftp客户端
* @param path 路径
* @param fileList 文件列表
* @throws IOException 异常
*/
private void getAllFiles(FTPClient ftp, String path, List<String> fileList) throws IOException {
// 切换路径
ftp.changeWorkingDirectory(path);
FTPFile[] ftpFiles = ftp.listFiles();
for (FTPFile ftpFile : ftpFiles) {
if (ftpFile.getType() == 0) {
// 文件直接添加
fileList.add(ftpFile.getName());
continue;
}
if (ftpFile.getType() == 1) {
// 文件夹修改路径进行递归
String sb = path +
"/" +
ftpFile.getName();
getAllFiles(ftp, sb, fileList);
}
}
}
调用该方法:
// 从ftp服务器获取文件列表
// 创建FTPClient对象
FTPClient ftp = new FTPClient();
try {
int reply;
// 连接前设置字符编码
ftp.setCharset(StandardCharsets.UTF_8);
ftp.setControlEncoding("UTF-8");
// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.connect(serverIP);
// 不需要账号密码时匿名登录
ftp.login("anonymous", null);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
throw new ApplicationException("connecting to ftp error.");
}
// 设置文件类型为二进制 (必须, 否则文件无法打开, 血的教训)
ftp.setFileType(FTP.BINARY_FILE_TYPE);
// 获取文件
// String path = "/temp/test";
String path = remotePath;
List<String> fileList = new ArrayList<>();
getAllFiles(ftp, path, fileList);
调用完后, fileList中就有指定目录下的所有文件名
依赖:
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.7</version>
</dependency>
定时调用逻辑使用的是PowerJob, 嫌麻烦可以直接使用spring自带的@Scheduled注解.
版权归原作者 aCupofGelato 所有, 如有侵权,请联系我们删除。