情景是这样的:每天会发布到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[i];
if (file.getType() == FTPFile.TYPE_DIRECTORY) {
String name = list[i].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[i].isDirectory()) {
String name = ff[i].getName();
String path = ff[i].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[i].isDirectory()){
if(!fs[i].delete())deleteDirectory(fs[i].getAbsolutePath());
else System.out.println("刪除目录 directory : "+fs[i].getAbsolutePath());
}else{
fs[i].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;
}
}
分享到:
相关推荐
在本文中,我们将深入探讨如何使用C#编程语言实现FTP(File Transfer Protocol)递归下载功能,以便能够从服务器获取整个目录结构,包括子目录及其内的所有文件。这个任务适用于那些需要从FTP服务器批量下载数据的...
本文将深入探讨如何利用VC++遍历FTP文件目录,结合Socket编程和文件操作SDK来实现这一功能。 首先,FTP是一种用于在网络上进行文件传输的标准协议,它允许用户从远程主机上下载文件或上传文件到远程主机。在VC++中...
在本文中,我们将深入探讨如何使用C++编程语言结合libcurl库来实现FTP(File Transfer Protocol)服务的两个主要功能:列出所有文件和目录,并下载所有文件。FTP是一种广泛使用的互联网协议,用于在服务器和客户端...
本文将详细讲解如何使用C#实现下载FTP指定目录下的所有文件及子目录中的文件。首先,我们需要引入必要的命名空间: ```csharp using System; using System.IO; using System.Net; ``` 接下来,定义一个方法来执行...
Java定时从FTP服务器更新相关文件是一项常见的任务,特别是在自动化数据同步和备份的场景中。这里主要涉及的技术点包括FTP协议、Java编程以及文件系统操作。本文将深入探讨这些知识点,并提供一个基于`ftp4j`库的...
Java 实现对比ftp文件和本地文件的修改时间 ftp服务器文件比本地文件新时 把服务器文件下载覆盖本地文件 更新本地文件
本文将深入探讨如何使用C#实现FTP(File Transfer Protocol)功能,包括文件目录的展示和文件的下载。我们将讨论以下几个关键知识点: 1. FTP基础知识:FTP是一种用于在Internet上进行文件传输的标准协议。它允许...
FTP下载自动更新文件是一种常见的软件更新机制,尤其在桌面应用中广泛使用。通过FTP(File Transfer Protocol),程序能够从远程服务器获取最新的文件,确保用户始终使用的是最新版本。本技术主要涉及以下几个关键...
在Java编程环境中,实现从FTP(File Transfer Protocol)服务器上按照其目录结构创建本地文件夹并下载文件是一项常见的任务。FTP是一种用于在网络上传输文件的标准协议,它允许用户从远程服务器上获取或发送文件。本...
【标题】"WEB版的ftp管理目录文件管理"所涉及的知识点主要集中在Web技术、FTP服务和数据库管理上。这个系统使用PHP编程语言与MySQL数据库相结合,构建了一个可以通过Web界面进行FTP目录和文件操作的应用。 首先,让...
8. 自定义功能扩展:根据需求,你可以修改代码以实现更多功能,比如递归上传子目录、断点续传、文件大小检查等。 总之,上传本地文件夹的文件到FTP服务器指定目录是一个涉及FTP协议、C#编程和文件系统操作的综合...
### VB 实现在FTP上生成目录及FTP上的文件复制 #### 概述 本文将详细介绍如何使用Visual Basic(VB)在FTP服务器上创建目录并实现文件复制功能。这涉及到调用WinINET DLL中的函数来实现与FTP服务器的交互。具体包括...
本项目“Delphi根据文件更新时间上传下载的FTP程序”是一个利用Delphi构建的FTP客户端应用,它具有检查本地文件与远程服务器上文件的修改时间的功能,并能自动上传或下载更新的文件。以下将详细解析这个项目的知识点...
### C#删除FTP文件夹(含子文件夹与文件)详解 #### 一、背景介绍 在进行FTP操作时,经常需要对服务器上的文件或文件夹进行管理,其中包括删除操作。对于简单的文件删除,通常使用.NET Framework提供的`...
`C#` 提供了一种方便的工具——`FileSystemWatcher`(文件系统观察者),也常被简称为`FileWatcher`,用于监控指定目录及其子目录下的文件和目录变更情况。`FileWatcher` 类是 .NET Framework 的一部分,它允许我们...
根据给定的信息,本文将详细解释如何利用Java与JSP技术来实现从FTP服务器上传下载文件的功能,并且会对部分给出的代码片段进行解读。 ### Java + JSP 实现 FTP 文件上传下载 #### 一、JSP 页面代码实现 在JSP页面...
这个实例项目旨在展示如何利用MFC(Microsoft Foundation Classes)库来实现文件和目录的显示,同时提供FTP连接以及文件的上传和下载。 首先,CListCtrl是MFC中一个非常有用的控件,它用于创建类似Windows资源管理...
E语言 列出所有子目录及文件 共开发人员研究删除目录或者FTP上传文件夹
### FTP 文件上传与实时更新技术解析 #### 一、引言 在开发涉及文件传输的应用时,FTP(File Transfer Protocol)是一种常用的协议。本篇文章将详细介绍如何使用VC++实现FTP文件的上传,并实时获取文件的大小信息。...
`forfiles`可以按日期筛选并执行操作,如10天前的文件会被删除。 8. **测试与实施**: 在正式应用到生产环境之前,应该先在测试环境中验证脚本的功能和性能,确保无误后再迁移。 9. **安全性考虑**: 使用FTP...