设为首页 收藏本站
查看: 1499|回复: 0

[经验分享] 从ftp根据子目录名(按日期+时间)更新文件(原创)

[复制链接]

尚未签到

发表于 2016-6-10 13:18:13 | 显示全部楼层 |阅读模式
情景是这样的:每天会发布到ftp服务器上以当天日期加时间的目录,下面存有要插入数据库的文件,  定时任务里 要去判断 ftp上是否有需要更新的数据文件 有则从ftp下载到本地 并把本地旧文件删除

这也许很简单,但是是我自己一个单词一个的打过来的,只想记录一下。
package com.ce.ftp;

import it.sauronsoftware.ftp4j.FTPAbortedException;
import it.sauronsoftware.ftp4j.FTPClient;
import it.sauronsoftware.ftp4j.FTPDataTransferException;
import it.sauronsoftware.ftp4j.FTPException;
import it.sauronsoftware.ftp4j.FTPFile;
import it.sauronsoftware.ftp4j.FTPIllegalReplyException;
import it.sauronsoftware.ftp4j.FTPListParseException;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import com.ce.util.CommonStringDateUtil;
import com.ce.util.PropertiesUtil;

/**
*  
* @author faithlee
*
*/
public class FtpTool {

private static FTPClient client = new FTPClient();

/**
* 连接且登录到特定的FTP服务器文件夹
*
* @return
* @throws FTPException
* @throws FTPIllegalReplyException
* @throws IOException
* @throws IllegalStateException
*/
public boolean connectToServer(PropertiesUtil pro, String filename)
throws IllegalStateException, IOException,
FTPIllegalReplyException, FTPException {


String server = pro.getValue(filename, "ftp.ip");
String user = pro.getValue(filename, "ftp.user");
String password = pro.getValue(filename, "ftp.password");
String path = pro.getValue(filename, "ftp.path");

client.connect(server);
client.login(user, password);
System.out.println("连接ftp服务器成功");

client.changeDirectory(path);

if (client.isCompressionSupported()) {
client.setCompressionEnabled(true);
}
return true;
}

/**
*   判断是否有新的数据文件下载
* @param path
* @param localpath
* @param date
* @param remoteDirMap
* @param localDirMap
* @return
* @throws IllegalStateException
* @throws IOException
* @throws FTPIllegalReplyException
* @throws FTPException
* @throws FTPDataTransferException
* @throws FTPAbortedException
* @throws FTPListParseException
*/
public boolean doUpdate(String ftppath, String localpath, String date)
throws IllegalStateException, IOException,
FTPIllegalReplyException, FTPException, FTPDataTransferException,
FTPAbortedException, FTPListParseException {
Boolean bl = false;
Map<String, FileObject> remoteFileMap = new HashMap<String, FileObject>();
Map<String,String> localDirMap = new HashMap<String,String>();
Map<String,String> remoteDirMap = new HashMap<String,String>();

remoteDirMap = getRemoteDir();
localDirMap = getLocalDir(localpath);

if (!remoteDirMap.isEmpty() && localDirMap.isEmpty()) {
System.out.println("本地为空,需要导入数据");
System.out.println("下载需要更新的数据文件...");
Set<Entry<String, String>> fileEntrySet = remoteDirMap.entrySet();
String dirname = "";
int n = 1;
for (Entry<String, String> entry : fileEntrySet) {

dirname = entry.getValue();
System.out.println("下载"+dirname+"的数据");
if (n == 1) {
client.changeDirectory(dirname);
} else {
client.changeDirectoryUp();
client.changeDirectory(dirname);
}
remoteFileMap = getRemotefiles();
String localdir = localpath + dirname;
File f = new File(localdir);
if (!f.exists()) {
f.mkdirs();
}

for (String filename : remoteFileMap.keySet()) {

client.download(filename, new File(localdir + "/"
+ filename));
}
n++;
}
System.out.println("下载完成");
bl = true;
} else {

if (remoteDirMap.containsKey(date)
&& !localDirMap.containsKey(remoteDirMap.get(date))) {
System.out.println("有新数据需要导入");

for(String localdirpath : localDirMap.values()){
System.gc();
deleteDirectory(localdirpath);
}

System.out.println("删除成功");
String dir = remoteDirMap.get(date);
String remoteDir = ftppath + dir;
client.changeDirectory(remoteDir);
remoteFileMap = getRemotefiles();
String localdir = localpath + dir;
File f = new File(localdir);
if (!f.exists()) {
f.mkdirs();
}
System.out.println("下载需要更新的数据文件...");
System.out.println("下载"+dir+"的数据");

for (String filename : remoteFileMap.keySet()) {
//System.out.println(filename);

client.download(filename, new File(localdir + "/"
+ filename));
}
System.out.println("下载文件完成");
bl = true;

} else {
System.out.println("没有新的数据文件需要更新");
bl = false;
}

}
return bl;
}

/**
*  获取远程文件信息
* @return
* @throws IllegalStateException
* @throws IOException
* @throws FTPIllegalReplyException
* @throws FTPException
* @throws FTPDataTransferException
* @throws FTPAbortedException
* @throws FTPListParseException
*/
public Map<String, FileObject> getRemotefiles()
throws IllegalStateException, IOException,
FTPIllegalReplyException, FTPException, FTPDataTransferException,
FTPAbortedException, FTPListParseException {
FTPFile[] remotefiles = client.list();
Map<String, FileObject> rtn = new HashMap<String, FileObject>();
for (FTPFile file : remotefiles) {
if (".".equals(file.getName()) || "..".equals(file.getName())) {
continue;
}
FileObject fo = new FileObject();
fo.filename = file.getName();
fo.lasttime = CommonStringDateUtil.format(file.getModifiedDate());
rtn.put(fo.filename, fo);
}
return rtn;
}

/**
*  获取远程目录信息
* @return
* @throws IllegalStateException
* @throws IOException
* @throws FTPIllegalReplyException
* @throws FTPException
* @throws FTPDataTransferException
* @throws FTPAbortedException
* @throws FTPListParseException
*/
public Map<String, String> getRemoteDir() throws IllegalStateException,
IOException, FTPIllegalReplyException, FTPException,
FTPDataTransferException, FTPAbortedException,
FTPListParseException {
Map<String, String> remoteDirName = new HashMap<String, String>();

FTPFile[] list = client.list();

for (int i = 0; i < list.length; i++) {
FTPFile file = list;
if (file.getType() == FTPFile.TYPE_DIRECTORY) {
String name = list.getName();

String dirDate = name.substring(0, name.length() - 2);
remoteDirName.put(dirDate, name);
}
}
return remoteDirName;
}
/**
*  获取本地目录信息
* @param localpath
* @return
*/
public  Map<String, String> getLocalDir(String localpath) {

Map<String, String> localDirName = new HashMap<String, String>();
File f = new File(localpath);
if (!f.exists()) {
System.out.println("目录不存在,创建目录");
f.mkdirs();
}
File[] ff = f.listFiles();

for (int i = 0; i < ff.length; i++) {
if (ff.isDirectory()) {
String name = ff.getName();
String path = ff.getPath();
localDirName.put(name, path);
}
}
return localDirName;
}

/**
*  删除目录
* @param localpath
*/
private void deleteDirectory(String path){
  File f = new File(path);
  if(!f.exists()){
   System.out.println("not exists");
   return;
  }
  if(f.delete()){
   System.out.println("delete directory : "+f.getAbsolutePath());
  }else{
   File[] fs = f.listFiles();
   for(int i=0;i<fs.length;i++){
    if(fs.isDirectory()){
     if(!fs.delete())deleteDirectory(fs.getAbsolutePath());
     else System.out.println("刪除目录 directory : "+fs.getAbsolutePath());
    }else{
     fs.delete();
     
    }
   }
   f.delete();
   
  }
  System.out.println("删除完成");
}

public void close() throws IllegalStateException, IOException,
FTPIllegalReplyException, FTPException {

client.disconnect(true);

}

}

class FileObject {
String filename;
String lasttime;

@Override
public String toString() {
return filename + "|" + lasttime;
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228706-1-1.html 上篇帖子: FtpClient 类来操作FTP的上传和下载,带进度条 下篇帖子: java做的比较完善的FTP连接上传下载文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表