多线程查询FTP Server上的文件

情形是这样的,最近做一个自动化的项目,当batch跑成功了,FTP Server上会有特定的生成文件。但是不确定是什么时候会有,大概是batch跑完了5分钟之内吧,所以在脚本里设置检查点的时候,需要每隔一段时间去刷新FTP Server上的文件。

网上下了个Serv-U去搭建了个本地的FTP Server,很容易就搭建调试好。然后又下了个commons-net-3.3.jar包去处理FTP相关的业务。

或许可以不需要用多线程,但是试了下,单线程的去退出再重新登录到FTP Server,FTP Server上的文件并不会自动刷新。所以我在main函数里,每隔一段时间就启动一个线程去看看我要找的文件是否存在。

import java.io.IOException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class FTPUtil extends Thread {
    private FTPClient ftpClient = new FTPClient();
    private String ftpdict = ".";
    private boolean flag;
    private static boolean find = false;
    private static long timeslot = 10000;

    public boolean connect(String host, int port, String username,
            String password) throws IOException {
        ftpClient.connect(host, port);
        if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
            if (ftpClient.login(username, password)) {
                return true;
            }
        }
        ftpClient.disconnect();
        return false;
    }

    public boolean fileExist(String dict, String filename) {
        String pattren = "\\.{1,}";
        ftpdict = ftpdict + "/" + dict;
        try {
            FTPFile[] files = ftpClient.listFiles(ftpdict);
            for (int i = 0; i < files.length; i++) {
                if (files[i].getName().equalsIgnoreCase(filename)) {
                    flag = true;
                }
                if (files[i].isDirectory()
                        && !files[i].getName().matches(pattren)) {
                    fileExist(files[i].getName(), filename);
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return flag;
    }

    public void disconnect() throws IOException {
        if (ftpClient.isConnected()) {
            ftpClient.disconnect();
        }
    }

    public void run() {
        System.out.println(getName() + " thread started!");
        FTPUtil ftp = new FTPUtil();
        try {
            ftp.connect("127.0.0.1", 21, "admin", "admin");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        boolean b = ftp.fileExist(ftp.ftpdict, "3.txt");
        System.err.println(b);
        if (b) {
            find = true;
        }
        try {
            ftp.disconnect();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(getName() + " thread ended!");
    }

    @SuppressWarnings("static-access")
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        int index = 0;
        while (!find) {
            new FTPUtil().start();
            Thread.currentThread().sleep(timeslot);
            if (index == 4) {
                return;
            }
            index++;
        }
    }
}

我觉得应该有api是去刷新这个FTP Server的,暂时还没有摸索到,有知道的告知一声谢谢咯。

时间: 2024-08-01 06:21:58

多线程查询FTP Server上的文件的相关文章

从ftp服务器上下载文件

从ftp服务器上下载文件 FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP是File Transfer Protocol(文件传输协议).顾名思义,就是专门用来传输文件的协议.简单地说,支持FTP协议的服务器就是FTP服务器. 那么怎样从ftp服务器上下载文件呢?具体操作如下: ftpget -u zyx -p 123456  192.168.1.156  /hello ftpget :指令

Linux中ftp不能上传文件/目录的解决办法

在linux中不能上传文件或文件夹最多的问题就是权限问题,但有时也不一定是权限问题了,像我就是空间不够用了,下面我来总结一些ftp不能上传文件/目录的解决办法 在排除用户组和权限等问题后,最可能引起ftp下文件无法上传并经常被忽略的因素就是硬盘空间已满,而导致硬盘空间满的问题多数是日志文件所占用的,例如mysql的日志会在不知不觉中变得十分庞大,直至占满剩余的硬盘空间. 解决办法: 1.定期手动清理或使用脚本清理mysql日志或其他相关日志文件. 2.关闭mysql日志(不推荐) 上面是空间有问

C# FileStream进行FTP服务上传文件和下载文件

定义FileStream类的操作类:操作类名: FtpUpDown 上传文件 /// <summary> /// 上传文件 /// </summary> /// <param name="localpath">上传文件的全路径 例@"D:\123.txt"</param> /// <param name="ftppath"></param> /// <returns&g

ftp无法上传文件

今天自己搭建个环境,首先当然是搞ftp啦,系统是centos 发现不能上传文件和新建目录及文件,找了下,归纳到一起 1.改vsftpd配置文件 #vi /etc/vsftpd/vsftpd.conf anon_upload_enable=YES anon_mkdir_write_enable=YES 2.更改selinux设置 # setsebool allow_ftpd_full_access 1 # setsebool allow_ftpd_use_cifs 1 # setsebool al

FTP 批量上传文件和文件夹 自动递归

其实是一个工具,ncftp 太他妈好用了, 下载地址在 http://www.ncftp.com/ 一句话自动递归目录,文件夹, 文件,全部上传到服务器 安装后,使用 ncftpput -R -u 用户 -p 密码 主机 远程目录 D:\本地目录

java读取FTP服务器上gz文件

FTPClient client = new FTPClient(); client.connect(CREDITDATA_FTP_IP, CREDITDATA_FTP_PORT); client.login(FTP_USERNAME, FTP_PASSWORD); client.changeWorkingDirectory("/out"); client.enterLocalPassiveMode(); //打开本地被动模式 client.setFileType(FTPClient.

本地Linux备份服务器[Client]定期备份云服务器[Server]上的文件(下)

https://www.cnblogs.com/kevingrace/p/5972563.html 原文地址:https://www.cnblogs.com/peteremperor/p/10678626.html

C#通过FTP账号上传、修改、删除文件 FTPClient

下面类文件中,主要做的工作是:从ftp服务器上下载文件把本地文件替换.添加.或删除功能,在替换本地文件时会先备份一下本地的文件,若整个操作都完成了就会发出commit命令,表示全部替换成功.若中间操作有失败的,则把本地文件回滚到替换前的样子. 描述: SynchroDataTest.cs(Winform页面类)中的addfiles数组代表要下载到本地的文件(有可能是添加或替换),delfiles数组是要把本地的这些文件删除的数组 string[] addfiles = new string[]

ftp上传文件

ftp服务使用apache的commons-net进行上传操作,所以要下载commons-net的jar包,服务器采用centeros linux操作系统,运行nginx服务器,安装使用yum -y install vsftp 安装vsftp服务,并创建ftp用户. 关于vsftp与nginx的安装,百度即可. 以下是使用代码的方式上传文件 ftpUtil.java package com.taotao.utils; import java.io.File; import java.io.Fil