java ftp連接掃描實例

Java遍历(扫描)ftp站点资源的方法

1.首先需要2个ftp的辅助jar包。(commons-net-1.4.1.jar和jakarta-oro-2.0.8.jar),这个可以自己去百度搜索一下并build path,然后就建一个类叫ListFtp后就能直接把下面的源代码复制然后运行了(当然你需改动里面你要扫描的ftp站点,和登陆用户名,密码这3样信息就OK了)。
2.遍历并打印在ftp里面扫描到的资源信息,主要还是用到递归思想。如果当前遍历的是文件夹,则继续向下一层目录遍历,如果是文件则打印出来。这里如果想保存资源信息的话可以自己写一个连接数据库的代码,然后把我那代码打印资源信息的地方改成插入到数据库即可。
源代码:
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

/*
 * 此类是直接可以运行,然后扫描
 * 我这扫描的ftp站点是自己电脑上建立的,外网扫描不到。
 * 如果要用此代码只需要改一下main函数里的ftp站点就能直接运行
 * */

public class ListFtp {

 private int recNum = 0;

 public static void main(String[] args) throws Exception {

  ListFtp listFtp = new ListFtp();
  //要扫描的ftp站点地址,用户名和密码,其中地址不用填前半部分信息。
  //如果ftp不需要用户名和密码就能直接进入其实是匿名登录方式。此时用户名是:anonymous,密码为空
  //如:listFtp.loginFtp("ftp.jmu.edu.cn", "anonymous", "");
  FTPClient ftp = listFtp.loginFtp("192.168.8.102", "liuli", "0425");
  listFtp.traverse("ftp://192.168.8.102", ftp, ftp
    .printWorkingDirectory());
  System.out.println("总共有" + listFtp.recNum +"个文件。");
  System.out.println("---------------------------------");
  listFtp.ftpClose(ftp);
 }

 //Ftp登陆,注意此处host不能带ftp://,直接传入站点后半部分就可以了
 public FTPClient loginFtp(String host, String user, String pass) {
  int reply;
  boolean loginFlag = false;
  FTPClient ftp = new FTPClient();
  ftp.setControlEncoding("GBK");
  try {
   ftp.connect(host);
   System.out.println("Connected to " + host);
   System.out.print(ftp.getReplyString());
   reply = ftp.getReplyCode();
   ftp.setFileTransferMode(FTP.ASCII_FILE_TYPE);
   if (!FTPReply.isPositiveCompletion(reply)) {
    ftp.disconnect();
    System.err.println("FTP server refused connection.");
    System.exit(1);
   }
   loginFlag = ftp.login(user, pass);
  } catch (IOException e) {
   e.printStackTrace();
  }
  if (loginFlag) {
   System.out.println("login success");
   System.out.println("host" + host);
   return ftp;
  } else {
   System.out.println("login failed");
   return null;
  }
 }

 //与ftp断开连接
 public void ftpClose(FTPClient ftp) {
  try {
   ftp.logout();
  } catch (IOException e) {
   e.printStackTrace();
  }
  if (ftp.isConnected()) {
   try {
    ftp.disconnect();
   } catch (IOException ioe) {
    ioe.printStackTrace();
   }
  }
  System.out.println("与ftp断开连接!");
 }

 // 遍历并打印ftp站点资源信息
 public void traverse(String host, FTPClient client, String path) {
  String prefix = "";
  try {
   FTPFile[] files = client.listFiles(path);
   for (int i = 0; i < files.length; i++) {
    // 如果是文件夹就递归方法继续遍历
    if (files[i].isDirectory()) {
     /*
      * 创建新目录时会自动创建两个文件名: . 和 .. 点指当前目录 点点指父目录
      */
     // 注意这里的判断,否则会出现死循环
     if (!files[i].getName().equals(".")
       && !files[i].getName().equals("..")) {
      String tempDir = client.printWorkingDirectory() + "/"
        + files[i].getName();
      client.changeWorkingDirectory(tempDir);
      // 是文件夹就递归调用
      traverse(host, client, tempDir);
      prefix += client.printWorkingDirectory();
      client.changeToParentDirectory();
     }
     // 如果是文件就扫描信息
    } else {
     String temp = client.printWorkingDirectory();
     Date date = null;
     // 根目录下的文件
     if (temp.equals("/")) {
      recNum++;
      date = files[i].getTimestamp().getTime();
      java.sql.Date date2 = new java.sql.Date(date.getTime());
      System.out.println("文件名:" + files[i].getName());
      System.out.println("文件路径:" + host + temp);
      System.out
        .println("文件大小:" + format(files[i].getSize()));
      System.out.println("最后修改日期:" + date2);
      System.out
        .println("-----------------------------------");
      // 不是根目录下的文件
     } else {
      recNum++;
      // 得到文件的时间戳
      date = files[i].getTimestamp().getTime();
      // 转换成保存到数据库的时间格式
      java.sql.Date date2 = new java.sql.Date(date.getTime());
      // 如果扫描是文件就将信息保存到数据库
      System.out.println("文件名:" + files[i].getName());
      System.out.println("文件路径:" + host + temp + "/");
      System.out
        .println("文件大小:" + format(files[i].getSize()));
      System.out.println("最后修改日期:" + date2);
      System.out
        .println("-----------------------------------");
     }
    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 // 转换文件大小的方法
 public String format(long size) {
  if (size < 1024) {
   return size + "B";
  } else if (size < 1048576) {
   double beforeNum = size / 1024;
   double temp = size % 1024;
   double afterNum = temp / 1024;
   // 取小数点后1位
   double num = new BigDecimal(beforeNum + afterNum).setScale(1,
     BigDecimal.ROUND_HALF_UP).doubleValue();
   return num + "KB";
  } else if (size < 1073741824) {
   double beforeNum = size / 1048576;
   double temp = size % 1048576;
   double afterNum = temp / 1048576;
   double num = new BigDecimal(beforeNum + afterNum).setScale(2,
     BigDecimal.ROUND_HALF_UP).doubleValue();
   return num + "MB";
  } else {
   double beforeNum = size / 1073741824;
   double temp = size % 1073741824;
   double afterNum = temp / 1073741824;
   double num = new BigDecimal(beforeNum + afterNum).setScale(2,
     BigDecimal.ROUND_HALF_UP).doubleValue();
   return num + "GB";
  }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值