获取FTP服务器某个目录下的所有文件列表

最近的一个需求为扫描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注解.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值