各位大神,我想实现这样一个功能:使用java语言从ftp上下载文件,正在下载中的文件使用.tmp后缀标记,下载完成后使用.log.gz,ftp上的文件就是.log.gz文件,请问怎么实现,最好有代码。使用字符串拼接,还有下载完成重命名都试过了,不起作用。
感觉像是文件没关闭造成的,你尝试着在fos.flush();后加一个fos.close()看看
这个文件类型没任何关系,应该是你代码问题,你把相关代码先贴一下吧。
别管文件名,下载完成后重命名就行了
private boolean downFileOrDir(String ftpFileName, String localDir) {
boolean flag = true;
try {
File file = new File(ftpFileName);
File temp = new File(localDir);
if(!temp.exists()) {
temp.mkdirs();
}
//判断是否是目录
if(isDir(ftpFileName)) {
String [] names = ftpClient.listNames();
for(int i=0; i < names.length; i++) {
System.out.println(i+1+":"+names[i]+"++++++");
if(isDir(names[i])) {
downFileOrDir(ftpFileName+'/'+names[i], localDir + File.separator + names[i].replace("*.", ""));
ftpClient.changeToParentDirectory();
}else {
String filetmp = localDir + File.separator + names[i]+".tmp";
String filedone = localDir + File.separator + names[i];
File localfile = new File(filetmp);
File localfiledone = new File(filedone);
if(localfiledone.exists()) {
continue;
}else if(localfile.exists()){
localfile.delete();
fos = new FileOutputStream(localfile);
ftpClient.retrieveFile(names[i], fos);
fos.flush();
} else {
fos = new FileOutputStream(localfile);
ftpClient.retrieveFile(names[i], fos);
fos.flush();
}
boolean b = localfile.renameTo(new File(filedone));
System.out.println(b);
}
}
} else {
String filetmp = localDir + File.separator + file.getName() +".tmp";
String filedown = localDir + File.separator + file.getName();
File localfile = new File(filetmp);
File localfiledown = new File(filedown);
if(localfiledown.exists()) {
return true;
} else if(localfile.exists()){
logger.debug("开始删除文件");
localfile.delete();
logger.debug("文件已经删除");
fos = new FileOutputStream(localfile);
ftpClient.retrieveFile(ftpFileName, fos);
fos.flush();
} else {
fos = new FileOutputStream(localfile);
ftpClient.retrieveFile(ftpFileName, fos);
fos.flush();
}
localfile.renameTo(localfiledown);
ftpClient.changeToParentDirectory();
}
logger.info("下载成功!");
} catch(SocketException e) {
logger.error("连接失败!", e);
flag = false;
return flag;
}catch (IOException e) {
logger.error("下载失败!", e);
flag = false;
return flag;
}
return flag;
}